ORDER BY中主键的MySQL性能问题

时间:2015-09-10 12:06:40

标签: mysql

使用ORDER BY

时,MySQL查询存在巨大的性能问题

以下查询返回超过5M行并执行速度非常快(< 0,1s)

SELECT * FROM logins WHERE users_id = 1

只要我添加ORDER BY,查询就会减慢到超过30秒

SELECT * FROM logins WHERE users_id = 1 ORDER BY id

idPRIMARY KEYusers_idINDEX

由于users_idid都已被编入索引,因此我不明白为什么第二个查询花了这么长时间。

当我运行EXPLAIN时,使用的key始终为users_id

如何更快地进行第二次查询? MySQL只使用该索引并忽略主键吗? 我应该使用users_idid的复合索引吗?

2 个答案:

答案 0 :(得分:0)

此查询的最佳索引:

SELECT *
FROM logins
WHERE users_id = 1
ORDER BY id;

logins(users_id, id)whereorder by都可以利用现有索引。 MySQL确定where的选择性比id的排序更重要。

答案 1 :(得分:0)

除了备用索引之外,请在此处取消:https://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

特别是在最后:

  

要提高ORDER BY速度,请检查是否可以让MySQL使用索引而不是额外的排序阶段。如果无法做到这一点,您可以尝试以下策略:

     

增加sort_buffer_size variable值。

     

增加read_rnd_buffer_size变量值。

     

每行使用较少的RAM,只需将列声明为保存存储在其中的值所需的大小。例如,如果值不超过16个字符,则CHAR(16)优于CHAR(200)。

     

将tmpdir系统变量更改为指向具有大量可用空间的专用文件系统。变量值可以列出以循环方式使用的几个路径;您可以使用此功能将负载分散到多个目录中。路径应该用Unix上的冒号字符(“:”)和Windows,NetWare和OS / 2上的分号字符(“;”)分隔。路径应命名位于不同物理磁盘上的文件系统中的目录,而不是同一磁盘上的不同分区。