Schema的优化和索引 - 学习一个索引示例
2009-09-02 00:00:00 来源:WEB开发网对于排序的优化
这个示例中我们所关心最后一个优化就是排序。排序小量规模的数据使用文件排序是很快的,但是如果有百万级别的呢?比如,查询条件只有个SEX的情况?
对于这种低选择性的情况,我们可以添加特殊的索引。比如,一个索引(sex,rating)可以适用于下列查询:
SELECT <cols> FROM profiles WHERE sex='M' ORDER BY rating LIMIT 10;
这个查询有ORDER BY 和LIMIT,并且它如果没有索引会非常之慢。
即使加上了索引,如果用户接口是分页并且用户请求的页并不是靠近数据开始的位置,查询还是很慢。语句如下:
mysql> SELECT <cols> FROM profiles WHERE sex='M' ORDER BY rating LIMIT 100000, 10;
这样的语句还是有问题,和加不加索引没什么关系。因为太高的数据偏移导致了MySQL不得不扫描没用的行。反规范的,提前计算的,缓存可能是处理这种语句比较好的方法。一个更好点的策略是限制用户可以查看的页数。这不太会影响用户体验,因为不会有人关心10000页以后的查询结果。
另一个优化这种语句比较好的方法是使用一个覆盖索引去重新获取行的主键。你能连接这个返回的表获得所需要的列。这些可以最小化MySQL的工作量,这些工作就是MySQL必须要收集它所要抛弃的数据。下面的例子就是针对这个语句的优化
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>);
更多精彩
赞助商链接