「Mysql索引原理(十四)」索引案例3-优化排序

时间:2022-07-24
本文章向大家介绍「Mysql索引原理(十四)」索引案例3-优化排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在这个学习案例中,最后要介绍的是排序。使用文件排序对小数据集是很快的,但如果个查询匹配的结果有上百万行的话会怎样?例如如果 WHERE子句只有sex列,如何排序?

对于那些选择性非常低的列,可以增加一些特殊的索引来做排序。例如,可以创建(sex,rating)索引用于下面的查询:

mysql> SELECT <cols>  FROM profiles WHERE sex=‘M’ ORDER BY rating LIMIT 10;

这个査询同时使用了ORDER BY和LIMIT,如果没有索引的话会很慢。即使有索引,如果用户界面上需要翻页,并且翻页翻到比较靠后时査询也可能非常慢。下面这个查询就通过ORDER BY和LIMT偏移量的组合翻页到很后面的时候:

mysql> SELECT <cols> FROM profiles WHERE sex=‘M’ ORDER BY rating LIMIT 100000, 10;

无论如何创建索引,这种査询都是个严重的问题。因为随着偏移量的增加, MySQL需要花费大量的时间来扫描需要丢弃的数据。反范式化、预先计算和缓存可能是解决这类查询的仅有策略。一个更好的办法是限制用户能够翻页的数量,实际上这对用户体验的影响不大,因为用户很少会真正在乎搜索结果的第10000页。

优化这类索引的另一个比较好的策略是使用延迟关联,通过使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行。这可以减少 MySQL扫描那些需要丢弃的行数。下面这个查询显示了如何高效地使用( sex, rating)索引进行排序和分页

 mysql> SELECT <cols> FROM profiles INNER JOIN (SELECT <primary key cols> 
FROM profiles WHERE X.sex='M' ORDER BY rating LIMIT 100000,10)AS X USING (<primary key cols>);