2

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

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

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

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);

我的问题是,如果第一个查询不能利用(性别等级)索引来查找行 100000-100010,那么第二个查询会怎么做?

4

1 回答 1

0

来自“高性能 MySQL 第 2 版”

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

优化此类查询的另一个好策略是使用覆盖索引仅检索您最终将检索的行的主键列。然后,您可以将其连接回表以检索所有所需的列。这有助于最大限度地减少 MySQL 必须完成的收集数据的工作量,而这些数据只会被丢弃

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

于 2013-06-06T03:20:07.467 回答