mysql选择子查询慢的地方

时间:2014-10-23 11:52:39

标签: php mysql performance

我有下表

  id | firstname | lastname | email             |  date
   1  | steven    | smith    | steven@gmail.com     2013-06-10 04:01:25
   2  | Bill      | Johnson  | bill@gmail.com    |  2014-06-10 04:01:25
   3  | steven    | smith    | steven@gmail.com  |  2014-10-10 12:01:25

此查询返回具有最新日期的电子邮件 因此,它将返回第2行和第3行。它不会返回第1行,因为日期低于第3行的日期

SELECT DISTINCT 
  us.email,
  us.* 
FROM
  `users` AS us 
WHERE us.`users` = 
  (SELECT 
    MAX(`date`)
  FROM
    `users` AS u 
  WHERE u.email = us.email)

该查询适用于少量数据,但是当我尝试在40k行上运行它时需要很长时间。超过5分钟

查询是我之前提出的问题的答案,所以sql小提琴链接

http://sqlfiddle.com/#!2/338f0/1

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,在相应列中添加一个索引 http://dev.mysql.com/doc/refman/5.0/en/create-index.html

答案 1 :(得分:0)

您可以尝试在电子邮件列上添加索引(在创建表后运行此代码):

CREATE INDEX i_users_email
    ON users (email);