【问题标题】:Mysql SQL query very slowmysql SQL查询很慢
【发布时间】:2014-03-21 04:35:43
【问题描述】:
我有这个架构,它会坐在爬虫的后面。 mitza.mine.nu
我不擅长 SQL,结果很接近。但查询
运行时间很长。对于 2 个单词,几乎需要一分钟,for3 forever
on 4555 records。 (当前生活样本运行另一个查询)
阙会这样做:
来自搜索 w1 w2 的单词命中 DICT 并获取单词 id。这是在单独的
查询。
-
从单词 id (271 and 8596 for example) 中选择所有记录并按以下顺序排序
(所有记录都包含按权重排序的两个单词),然后是单词 1,然后是单词 2,按权重排序。
SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
links.url,words.weight,words.wordid
FROM links
JOIN words ON (words.linkid=links.linkid)
JOIN domain ON (domain.siteid=links.siteid)
WHERE links.linkid IN (SELECT linkid FROM words WHERE wordid=271)
AND links.linkid IN (SELECT linkid FROM words WHERE wordid=8596)
ORDER BY words.weight DESC LIMIT 0, 8
【问题讨论】:
标签:
mysql
search
many-to-many
query-optimization
【解决方案1】:
尝试以下查询,避免重复调用链接表。
SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
links.url,words.weight,words.wordid
FROM links
JOIN words ON (words.linkid=links.linkid)
JOIN domain ON (domain.siteid=links.siteid)
WHERE (words.wordid=271 or words.wordid=8596)
ORDER BY words.weight DESC LIMIT 0, 8
并确保您的主键上有索引。
【解决方案2】:
不要使用内部查询。还要避免在 where 子句中使用 OR,因为它不使用索引。在 wordid、linkid 和 siteid 上建立索引并尝试以下查询:
SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
links.url,words.weight,words.wordid
FROM links
JOIN words ON (words.linkid=links.linkid)
JOIN domain ON (domain.siteid=links.siteid)
WHERE words.wordid IN (271,8596)
ORDER BY words.weight DESC LIMIT 0, 8
【解决方案3】:
试试这个:
SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
links.url,words.weight,words.wordid
FROM links
JOIN
(SELECT linkid,weight,wordid FROM words WHERE wordid IN (271,8596)) words
ON (words.linkid=links.linkid)
JOIN domain
ON (domain.siteid=links.siteid)
ORDER BY words.weight DESC LIMIT 0, 8;