优化这个mysql php查询

时间:2013-09-18 14:34:52

标签: php mysql sql

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

1 个答案:

答案 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进行索引,不需要将字符串字符匹配到用户关键字。