内部连接大表与小表,如何加快

时间:2010-11-30 11:23:58

标签: php sql mysql

亲爱的php和mysql专家 我有两个表一个大的帖子artices 200,000records(索引colume:sid),一个小表(索引colume topicid)的主题有20个记录..有相同的 topicid

curent im使用:(花了0.4秒)

+从表中获取最后50条记录:

SELECT sid,aid,title,time,topic,informant,ihome,alanguage,counter,type,images,chainid FROM veryzoo_stories ORDER BY sid DESC LIMIT 0,50

+然后在每个记录中执行while循环,以便在每个帖子中找到主题的加工名称:

while(..){ SELECT topicname FROM veryzoo_topics WHERE topicid ='$ topic'“ .... }

+立即 我将使用内部加入来加速进程,但是我的测试需要更长的时间从1.5秒到3.5秒

选择a.sid,a.aid,a.title,a.time,a.topic,a.informant,a.ihome,a.alanguage,a.counter,a.type,a.images,a。 chainid,t.topicname FROM veryzoo_stories a INNER JOIN veryzoo_topics t on a.topic = t.topicid ORDER BY sid DESC LIMIT 0,50

看起来内连接都是从两个桌面拳头连接200k记录然后将结果限制在50 ..这需要很长时间..

请帮我指点一下这样做.. 例如,从表1中获取最后50条记录..然后将其加入表2 ..等

3 个答案:

答案 0 :(得分:0)

使用内部联接,除非两个表共享相同的主键,否则您将获得重复的值(当然,查询速度较慢)。

答案 1 :(得分:0)

我只是对嵌套查询+内连接进行测试,并且惊讶于性能提高了很多:它现在只用了0.22秒。这是我的疑问:

SELECT a.*, t.topicname 
FROM (SELECT sid, aid, title, TIME, topic, informant, ihome, alanguage, counter, TYPE, images, chainid 
  FROM  veryzoo_stories 
  ORDER BY sid DESC 
  LIMIT 0, 50) a 
  INNER JOIN veryzoo_topics t ON a.topic = t.topicid 

如果没有更多解决方案出现,我可以使用这个...感谢任何人看这篇文章

答案 2 :(得分:0)

请试试这个:

SELECT * 
FROM (
SELECT a.sid, a.aid, a.title, a.time, a.topic, a.informant, a.ihome, a.alanguage, a.counter, a.type, a.images, a.chainid
FROM veryzoo_stories a
ORDER BY sid DESC 
LIMIT 0 , 50
)b
INNER JOIN veryzoo_topics t ON b.topic = t.topicid

我做了一个小测试,似乎更快。它使用子查询(嵌套查询)首先选择50条记录,然后加入。

还要确保veryzoo_stories.sid,veryzoo_stories.topic和veryzoo_topics.topicid是索引(如果使用InnoDB,则存在关系)。它应该提高性能。

现在它留下了ORDER BY LIMIT的问题。它很重,因为它在选择之前订购了200,000条记录。我想这是必要的。使用ORDER BY时,索引非常重要。

以下是有关此问题的文章:ORDER BY … LIMIT Performance Optimization