MySQL ORDER BY杀死了我的SQL查询

时间:2011-08-03 23:14:29

标签: mysql sql group-by

我有多个表格,其中包含管视频的相关信息。我需要连接这三个表并获取所需的列,然后按最近的(unix时间戳)对它们进行排序。视频列有120万条记录,video_data有超过800万条记录,而tube只有22条记录。

此查询在没有ORDER BY部分的情况下正常工作:

  

SELECT vd.video_id,vd.tube_id,v。*,t.tube_title,t.tube_domain FROM   video_data vd JOIN video v ON vd.video_id = v.video_id JOIN tube t ON   vd.tube_id = t.tube_id LIMIT 100

以上查询耗时0.0002秒

但是,只要我想按时间戳排序,如果服务器没有先重置它,则需要4-5分钟才能运行。

  

SELECT vd.video_id,vd.tube_id,v。*,t.tube_title,t.tube_domain FROM   video_data vd JOIN video v ON vd.video_id = v.video_id JOIN tube t ON   vd.tube_id = t.tube_id ORDER BY v.date_timestamp DESC LIMIT 100

以上查询花了272.9157秒

我在v.date_timestamp字段中添加了一个索引,看看是否有帮助,但显然不是。也许在该列上放一个索引无论如何都没有意义?任何帮助都会很棒,我仍然是SQL的新手......

4 个答案:

答案 0 :(得分:0)

尝试运行EXPLAIN SELECT …并查看MySQL所说的内容:http://dev.mysql.com/doc/refman/5.0/en/explain.html

也许您猜测的索引由于某种原因未被使用。

也许http://hackmysql.com/case3也有帮助吗?

答案 1 :(得分:0)

不是肯定的,但我相信问题可能是当你在video.date_timestamp上有索引时,你的查询必须首先点击每个video_data条目才能加入视频。

你应该通过反规范化看到如下的大加速:将date_timestamp字段复制到video_data表并对其进行索引/排序,而不是视频中的等效字段。

答案 2 :(得分:0)

首先,我相信如果你使用DESC你的索引是没用的 - 至少我看过这样的陈述。

无论如何,你可以考虑做这样的事情:

SELECT ... FROM(SELECT video_id,tube_id FROM video_data ORDER BY timestamp LIMIT 100)as vd INNER JOIN ...

也许会更快。关键是限制100:)

答案 3 :(得分:0)

重新加入,以便最小的表位于第一位 - 这是一个好习惯。

SELECT vd.video_id, vd.tube_id, v.*, t.tube_title, t.tube_domain 
FROM tube t
INNER JOIN video_data vd
  ON vd.tube_id = t.tube_id
INNER JOIN video v
  ON v.video_id = vd.video_id
 ORDER BY v.date_timestamp DESC LIMIT 100

我敢打赌这会有所帮助,因为在22管记录进入之前不会加载视频数据,所以整体结果集会小得多。 另外,如果你想要的话,很好地展示INNER JOIN。