为什么这个覆盖索引查询在远离开始分页时表现更好?

时间:2013-06-06 02:37:06

标签: mysql performance

在阅读“高性能MySQL第2版”的“优化排序”部分时,我发现很难理解以下内容:

  

的MySQL> SELECT FROM profiles WHERE sex ='M'ORDER BY rating LIMIT 100000,10;

     

这些查询可能是一个严重的问题,无论它们如何编入索引,因为   高偏移要求他们花费大部分时间来扫描他们的大量数据   然后扔掉。
  ...
  优化此类查询的另一个好策略是使用覆盖索引   只检索您最终将检索的行的主键列。 ......这是一个需要(性别,评级)指数才能有效运作的例子:

     

mysql> SELECT(cols)FROM个人资料INNER JOIN(
    的 - > SELECT(主键cols)FROM个人资料
    的 - > WHERE x.sex ='M'ORDER BY rating LIMIT 100000,10
     - >)AS x USING(主键cols);

我的问题是,如果第一个查询无法利用(性别评级)索引查找行100000-100010,那么第二个查询将如何进行?

1 个答案:

答案 0 :(得分:0)

来自“高性能MySQL第二版”

  

无论这些查询如何被编入索引,这些查询都可能是一个严重的问题,   因为高偏移要求他们花费大部分时间   扫描他们将丢弃的大量数据。的反规范化,   预计算和缓存可能是唯一的策略   为这样的查询工作。更好的策略是限制   您让用户查看的页数。这不太可能影响   用户的体验,因为没有人真正关心第10,000个   搜索结果页面。

     

优化此类查询的另一个好策略是使用覆盖   index只检索您要行的主键列   最终检索。然后,您可以将其加入表格中   检索所有想要的列。这有助于最大限度地减少工作量    MySQL必须收集只丢弃的数据

有人说这个查询没有更好的改进。它只是建议将列选择的数量最小化到index列(当然为了节省存储所有10,0000行列的数据的内存,以便在扫描过程中仅存储10,000行的索引列) 。然后使用10个检索索引构建完整列。