我在 MySQL 中有一个查询,如下所示:
SELECT t.field1, t.field2, t.field5, t.field6, t.field7
FROM mytable as t
WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0
order by t.field5 desc
LIMIT 0, 100;
查询不是很快(10秒),问题似乎是ORDER BY部分,没有该行查询需要0.01秒,使用ASC而不是desc大约需要1秒。
我已经创建了一个索引,其中查询的 WHERE/ORDER BY 部分中的所有字段的顺序与查询中出现的顺序相同(field1、field2、field3、field4、field5),但它没有根据在 MySQL 中“解释”。
field1 具有相当高的基数(大约有 100 个不同值的整数)field2 和 field3 是 BOOLEAN,field5 是具有高基数的字符串(但 LENGTH(field5) > 0 使基数较低,或者?)。
field5 上还有一个单独的索引,这是当查询如上所示时使用的唯一索引,删除查询的 ORDER BY 部分将使 MySQL 使用多列索引。
我在这里缺少什么?
编辑:这是实际的 SQL:
SELECT t.shopid, t.isproduct, t.level, t.isduplicate, t.ref_id
FROM urls as t
WHERE t.shopid = 72 AND t.isproduct = 1 AND t.visited = 0 AND LENGTH(t.url) > 0
ORDER BY t.level desc
LIMIT 0, 100;
最佳答案
如果不真正了解表大小和数据类型,就很难预测查询性能。 Mysql优化器有它自己的方法来决定使用哪个索引,这通常是相当不错的。
您可以通过使用FORCE INDEX
强制mysql使用各种索引来进行命中和试验。由于显而易见的原因,t.url 上的索引永远无法使用。
您可以尝试的一件事是:
从 (SELECT t.field1, t.field2, t.field5, t.field6, t.field7 FROM mytable 中选择 t.field1, t.field2, t.field5, t.field6, t.field7 as t WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0) t order by t.field5 desc LIMIT 0, 100;
通常不建议这样做,但如果输出行数不大,这可以帮助您。
关于mysql - 如何为带有 ORDER BY 子句的 SQL 查询选择正确的索引 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19377592/