你可以帮我优化这个mysql查询或者编写这个mysql查询的任何其他方式吗,它运行但是需要花费太多时间。
SELECT DISTINCT
A.item1,
A.item2,
A.item3,
FROM tableAA AS A
INNER JOIN(tableBB AS B)
ON(A.item4 = B.item4)
INNER JOIN(tableCC AS C)
ON(A.item4 = C.item4)
INNER JOIN(tableDD AS D)
ON(A.item4 = D.item4)
WHERE (B.item5 = '$selected1' AND
B.item6 LIKE '%$selected2%' AND
C.item7='$selected3' ) OR
(A.item8 LIKE '%$selected2%' AND
D.item5 = '$selected1' AND
C.item7='$selected3')
有没有其他方法可以编写此查询?
编辑: tableAA& tableBB& tableCC包含数十亿条目,我想我已正确索引表。
edit2:但我认为问题不在Like%条件下。我已将其关闭并再次运行查询。但它仍然需要很长时间,如565秒。
答案 0 :(得分:2)
一些显而易见的事情。
1)表A,B,C和D的索引项目4。 通常,索引会加速读取(wheres和join)并减慢写入速度。
2)索引你做了很多直接“在哪里”的列--B.item5等。但不是B.item6,索引在你的“喜欢”匹配中没有任何改变。
3)最后一个需要花费更多时间,但是如果你必须使用类似“%$ key%”的搜索非常重要,因为这些非常耗时 - 几乎每列中每个字符串的每个字符都与您的搜索字符串:创建表格,其中列出,搜索和搜索B.item6和A.item8的搜索关键字。如果你这样做,你可以在这些列上进行二元搜索 - 这是一个巨大的变化。
========编辑:你说索引已经完成,所以更多关于上面的第3点。 ============
假设您有一个要搜索的表:
table A
-------
k (PK)
s (big string)
你想做的事:
select k
from A
where s like '%$keyword%'
是一个长字符串,在一个未知的地方搜索关键字的每次出现的s都将非常耗时。
所以我们再创建一个表:
table s_words
-------------
word | (PK)
k * |
s_words是在s中找到的单词列表,其中的键用于查找表A中的相应行。每个单词出现多次,通常在表中多次出现。要填充s_words,您需要获取s中的所有字符串,解析它们,并将每个单词添加到表中。
现在您的查询是:
select k
from s_words
where word = '$keyword'
现在可以对word进行索引,不需要将字符串字符匹配到用户关键字。