【发布时间】:2011-12-27 18:20:20
【问题描述】:
在订购时,以下查询需要 30 秒才能完成。如果没有命令,它会在 0.0035 秒内完成。我已经在字段“名称”上有一个索引。字段“id”是主键。我在这张表中有 400,000 条记录。请帮忙,使用order by时查询有什么问题。
SELECT *
FROM users
WHERE name IS NOT NULL
AND name != ''
AND ( status IS NULL OR status = '0' )
order by id desc
limit 50
更新:(最后的解决方案) 大家好,感谢您的帮助。以下是您要求的一些更新:
-
下面是解释的输出。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE 用户范围名称 name 258 NULL 226009 使用 where;使用文件排序
是的,此表中大约有 20 个字段。
-
以下是我拥有的索引:
键名类型基数字段
初级初级 418099 id 名称索引 411049 名称
解决方案: 事实证明,具有空值的字段是原因。将 where 条件中的这 2 个字段设为 NOT NULL 时,只需 0.000x 秒。但奇怪的是,如果我创建 (status,name,id DESC) 或 (status,name,id) 的索引,它会增加到 29 秒。
【问题讨论】:
-
至少,您应该在查询中包含“解释”的输出。
-
明确标识要查询的列时是否有任何变化?
-
您的结果集是否庞大,您的
id是否已编入索引? -
order by id(无 desc)的表现如何?
-
@Paul Sanwald - 我添加了解释的输出。
标签: mysql performance