explain select * from staffs where name > 'Mary'
;)索引的口诀如下:全值匹配我最爱,最左前缀要遵守,带头大哥不能死,中间兄弟不能断,索引列上少计算,范围之后全失效(跟创建索引的顺序有关系),like百分写最右,
覆盖索引不写星,不等非空还有or,索引失效要少用,varchar引号不可丢(不加也可以查询出来,sql底层会做一个隐式转,但是索引就会失效)
4. 聚簇索引和非聚簇索引
1. 聚簇索引(一种存储方式,指的是数据航跟相邻的键值紧凑的存储再一起) 。*
* 当直接采用主键进行检索时,可通过主键索引直接获得数据;而当采用非主键进行检索时,先需要通过辅助索引来获得主键,然后再通过这个主键在主键索引中找到对应的数据行
2. 非聚簇索引(数据文件跟索引文件分开存放)
* 无论是主键索引还是辅助索引的检索过程,都只需要通过相应的 B+Tree 进行搜索即可获得数据对应的物理地址,然后经过依次磁盘 I/O 就可访问数据
-- 执行计划是const
select actor_id from actor where actor_id=4;
-- 执行计划是index
select actor_id from actor where actor_id+1=5;
https://www.cnblogs.com/taojietaoge/p/16167188.html
-- 2步
explain select * from actor where actor_id = 1 union all select * from actor where actor_id = 2;
-- 耗时最短
explain select * from actor where actor_id in (1,2);
-- 耗时币in 长
explain select * from actor where actor_id = 1 or actor_id =2;
问题:
select * from product limit 866613, 20 37.44秒
优化:
对limit分页问题的性能优化方法 利用表的覆盖索引来加速分页查询
这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下:
select id from product limit 866613, 20 0.2秒
相对于查询了所有列的37.44秒,提升了大概100多倍的速度
那么如果我们也要查询所有列,有两种方法,一种是id>=的形式(相当于查出来第866613行的id,再通过索引查20条)
SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
查询时间为0.2秒,
另一种就是利用join
另一种写法SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id查询时间也很短,赞!
参考:
https://juejin.cn/post/6844903621390254093