让我们仔细看看您的查询有ORDER BY id DESC LIMIT 300000, 15
.
MySQL 服务器必须做什么才能执行它?首先,它必须根据主索引id
以降序获取每条记录。请注意,这必须发生 300k 次。一旦达到 300,000 个计数,服务器才可以开始输出结果行,并且只有 15 个。如果您使用的不是 300k 初始偏移量,而是更小的值,则此查询会运行得更快。
为什么 query1 与 query2 相差 10 倍?这是因为TEXT
MySQL中的列链接到父表(未存储在其中)并且检索它们需要额外的查找,但VARCHAR
存储在表中。在您的情况下,TEXT
列获胜,因为您实际上不需要拉body
列,直到您达到第 300,000 行(服务器仅拉body
TEXT
取对另一个不可见表中的列的相对较小的引用)。但是在title
列的情况下,服务器别无选择,只能拉满title
列,即使它在 100 字节的范围内,这就是它慢 10 倍的原因。
很难说清楚。这可能是因为第一个查询运行缓慢,但将所有表数据缓存在 RAM 中,所以第二个可以运行得更快。在得出任何结论之前,您应该至少重复所有查询 3 次。
我对你的建议是找到一种方法来LIMIT 300000, 15
替换
WHERE id BETWEEN 300000 AND 300014
或等效的,如果可以的话。在这种情况下,服务器将能够利用主索引,而且速度会快如闪电。