使用ORDER BY
以下查询返回超过5M行并执行速度非常快(< 0,1s)
SELECT * FROM logins WHERE users_id = 1
只要我添加ORDER BY
,查询就会减慢到超过30秒
SELECT * FROM logins WHERE users_id = 1 ORDER BY id
id
为PRIMARY KEY
,users_id
为INDEX
。
由于users_id
和id
都已被编入索引,因此我不明白为什么第二个查询花了这么长时间。
当我运行EXPLAIN
时,使用的key
始终为users_id
。
如何更快地进行第二次查询?
MySQL只使用该索引并忽略主键吗?
我应该使用users_id
和id
的复合索引吗?
答案 0 :(得分:0)
此查询的最佳索引:
SELECT *
FROM logins
WHERE users_id = 1
ORDER BY id;
是logins(users_id, id)
。 where
和order by
都可以利用现有索引。 MySQL确定where
的选择性比id
的排序更重要。
答案 1 :(得分:0)
除了备用索引之外,请在此处取消:https://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
特别是在最后:
要提高ORDER BY速度,请检查是否可以让MySQL使用索引而不是额外的排序阶段。如果无法做到这一点,您可以尝试以下策略:
增加read_rnd_buffer_size变量值。
每行使用较少的RAM,只需将列声明为保存存储在其中的值所需的大小。例如,如果值不超过16个字符,则CHAR(16)优于CHAR(200)。
将tmpdir系统变量更改为指向具有大量可用空间的专用文件系统。变量值可以列出以循环方式使用的几个路径;您可以使用此功能将负载分散到多个目录中。路径应该用Unix上的冒号字符(“:”)和Windows,NetWare和OS / 2上的分号字符(“;”)分隔。路径应命名位于不同物理磁盘上的文件系统中的目录,而不是同一磁盘上的不同分区。