在阅读“高性能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,那么第二个查询将如何进行?
答案 0 :(得分:0)
来自“高性能MySQL第二版”
无论这些查询如何被编入索引,这些查询都可能是一个严重的问题, 因为高偏移要求他们花费大部分时间 扫描他们将丢弃的大量数据。的反规范化, 预计算和缓存可能是唯一的策略 为这样的查询工作。更好的策略是限制 您让用户查看的页数。这不太可能影响 用户的体验,因为没有人真正关心第10,000个 搜索结果页面。
优化此类查询的另一个好策略是使用覆盖 index只检索您要行的主键列 最终检索。然后,您可以将其加入表格中 检索所有想要的列。这有助于最大限度地减少工作量 MySQL必须收集只丢弃的数据。
有人说这个查询没有更好的改进。它只是建议将列选择的数量最小化到index
列(当然为了节省存储所有10,0000行列的数据的内存,以便在扫描过程中仅存储10,000行的索引列) 。然后使用10个检索索引构建完整列。