mysql - 如何为带有 ORDER BY 子句的 SQL 查询选择正确的索引 (MySQL)

标签 mysql sql indexing sql-order-by

我在 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/

相关文章:

mysql - 显示学生人数最多的院系名称

php 脚本在转储文件中执行 sql 语句

mysql - 计算平均值后合并同一个表中的两行

search - 谷歌不索引面包屑导航

python - 输入数组相等时索引矩阵元素

php - 为什么我的 while 循环似乎总是错误的

html - HTTP 状态 500 - 在第 6 行处理 JSP 页面/webtech/login.jsp 时发生异常

mysql - 为什么我在搜索整数时不应该包含数字?

mysql - 在 MYSql 中索引电子邮件地址的最佳方法是什么

java - 如何获取应用程序退出前读取的数据库表的最后一行行号