我有多个表格,其中包含管视频的相关信息。我需要连接这三个表并获取所需的列,然后按最近的(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的新手......
答案 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。