MySQL8.0索引特性3-倒序索引
我们今天来介绍下 MySQL 8.0 引⼊的新特性:倒序索引。
MySQL长期以来对索引的建⽴只允许正向asc存储,就算建⽴了desc,也是忽略掉。
⽐如对于以下的查询,⽆法发挥索引的最佳性能。
查询⼀:
select * from tb1 where f1 = ... order by id desc;
查询⼆:
select * from tb1 where f1 = ... order by f1 asc , f2 desc;
那对于上⾯的查询,尤其是数据量和并发到⼀定峰值的时候,则对OS的资源消耗⾮常⼤。⼀般这样的SQL在查询计划⾥⾯会出现using filesort等状态
⽐如针对下⾯的表t1,针对字段rank1有两个索引,⼀个是正序的,⼀个是反序的。不过在MySQL 8.0 之前的版本都是按照正序来存储
powerpoint官方电脑版下载2016按照rank1 正向排序的执⾏计划,
bigdecimal强制保留两位小数按照rank1 反向排序的执⾏计划,
从执⾏计划来看,反向⽐正向除了extra⾥多了Using temporary; Using filesort这两个,其他的⼀模⼀样。这两个就代表中间⽤到了临时表和排序,⼀般来说,凡是执⾏计划⾥⽤到了这两个的,性能⼏乎都不咋地。除⾮我这个临时表不太⼤,⽽⽤于排序的buffer也⾜够⼤,那性能也不⾄于太差。那这两个选项到底对性能有多⼤影响呢?
我们分别执⾏这两个查询,并且查看MySQL的session级的status就⼤概能看出些许不同。
dialog+通过以上两张图,我们发现反向的⽐正向的多了很多个计数,⽐如通过扫描的记录数增加了10倍,⽽且还伴有10倍的临时表的读和写记录数。那这个开销是⾮常巨⼤的。那以上的查询是在MySQL 5.7 上运⾏的。
MySQL 8.0 给我们带来了倒序索引(Descending Indexes),也就是说反向存储的索引。这⾥不要跟搜索引擎中的倒排索引混淆
了,MySQL这⾥只是反向排序存储⽽已。不过这个倒序存储已经解决了很⼤的问题。我们再看下之前在MySQL 5.7 上运⾏的例⼦。
我们把数据导⼊到MySQL 8.0,
mysql面试题索引jquery教程哪个好再把原来的索引变为倒序索引,
再次看下第⼆个SQL的查询计划,
很显然,⽤到了这个倒序索引 idx_rank1_desc,⽽这⾥的临时表等的信息消失了
当然了,这⾥的组合⽐较多,⽐如我这张表的字段rank1,rank2两个可以任意组合
组合⼀:
(rank1 asc,rank2 asc);工作流引擎 python
组合⼆:
(rank1 desc,rank2 desc);
组合三:
(rank1 asc,rank2 desc);
组合四:
(rank1 desc,rank2 asc);
我把这⼏个加上,适合的查询⽐如:
查询⼀:
Select*from t1 where rank1 =11order by rank2;查询⼆:
Select*from t1 where1order by rank1,rank2;
查询三:
Select*from t1 where1order by rank1 desc,rank2;。。。。。
等等,这⾥就不⼀⼀⽰范了!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论