科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Schema的优化和索引 - 学习一个索引示例5

Schema的优化和索引 - 学习一个索引示例5

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Schema的优化和索引 - 学习一个索引示例

作者:ddvip 来源:ddvip 2009年12月23日

关键字: PHP MySQL Schema

  • 评论
  • 分享微博
  • 分享邮件

Schema的优化和索引 - 学习一个索引示例5

对于排序的优化

  这个示例中我们所关心最后一个优化就是排序。排序小量规模的数据使用文件排序是很快的,但是如果有百万级别的呢?比如,查询条件只有个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>);

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章