0

你能帮我优化这个 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 秒。

4

1 回答 1

2

一些明显的事情要做。

1) 在表 A、B、C 和 D 上索引 item4。通常,索引会加快读取速度(wheres 和 joins)并减慢写入速度。

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 是一个长字符串,在一个未知的地方搜索关键字的每一个 s 出现,将非常耗时。

所以我们再创建 1 个表:

table s_words
-------------
word | (PK)
k *  |

s_words 是在 s 中找到的单词列表,带有在表 A 中查找相应行的键。每个单词在表中出现多次,通常是多次。要填充 s_words,您需要获取 s 中的所有字符串,解析它们,并将每个单词添加到表中。

现在您的查询是:

select k
from s_words
where word = '$keyword'

现在可以对单词进行索引,无需将字符串与用户关键字逐字符匹配。

于 2013-09-18T19:40:24.737 回答