使用联合索引进行查询时一定要遵循左前缀原则, 什么是左前缀原则呢? 就是说想让索引生效的话,一定要添加上第一个索引, 只使用第二个索引进行查询的话会导致索引失效
比如上面创建的联合索引, 假如我们的查询条件是 where id = '1' 或者 where id = '1' and title = '唐诗宋词' 索引都会不失效
但是如果我们不使用第一个索引id, 像这样 where title = '唐诗' , 结果就是导致索引失效
联合索引的分组&排序还是使用这个例子:
CREATE TABLE `text` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` text NOT NULL, PRIMARY KEY (`id`,`title`) ) ENGINE=InnoDB AUTO_INCREMENT=3691 DEFAULT CHARSET=utf8demo1: 当我们像下面这样写sql时, 就会先按照id进行排序, 当id相同时,再按照title进行排序
select * form text order by id, title;demo2: 当我们像下面这样写sql时, 就会先将id相同的划分为一组, 再将title相同的划分为一组
select id,title form text group by id, title;demo3: ASC和DESC混用, 其实大家都知道底层使用B+树, 本身就是有序的, 要是不加限制的话,默认就是ASC, 反而是混着使用就使得索引失效
select * form text order by id ASC, title DESC; 如何定位慢查询相关参数
名称 简介slow_query_log 慢查询的开启状态
slow_query_log_file 慢查询日志存储的位置
long_query_time 查询超过多少秒才记录下来
常用sql
# 查看mysql是否开启了慢查询 show variables like 'slow_query_log'; # 将全局变量设置为ON set global slow_query_log ='on'; # 查看慢查询日志存储的位置 show variables like 'slow_query_log_file'; # 查看规定的超过多少秒才被算作慢查询记录下来 show variables like 'long_query_time'; show variables like 'long_query%'; # 超过一秒就记录 , 每次修改这个配置都重新建立一次链接 set global long_query_time=1;