优化这个mysql-php查询

优化这个mysql-php查询,php,mysql,sql,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)

你能帮我优化这个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:但我认为问题不在%左右。我已将其关闭,然后再次运行查询。但这仍然需要565秒的时间

一些显而易见的事情要做

1表A、B、C和D中的索引项4。 通常,索引会加快读取位置和连接,并降低写入速度

2为你做了很多直接的列编制索引,如B.item5等,但不是B.item6,在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_单词是在s中找到的单词列表,键用于查找表a中相应的行。每个单词出现多次,通常在表中出现多次。要填充s_单词,您需要在s中获取所有字符串,解析它们,然后将每个单词添加到表中

现在您的查询是:

select k
from s_words
where word = '$keyword'

现在word可以编制索引,不需要将字符串逐字符匹配到用户关键字。

请查看类似问题,并提供其他人提供的所需数据。重写查询的方法有很多。请包含查询的解释,以提供有关查询效率低下的信息。当字符串进行这样的匹配时,通常需要为正在匹配的列编制索引以提高性能。您是否可以在“选择字段”查询中提供更多有关您期望得到的所有最终列的信息。所有表b、c、d中似乎都需要连接,因为它们都是连接的,无论在何处,它们必须在每个相应的表中,或者应该是左连接,其中项目4可能不存在于其他表中。如果您希望我们帮助优化查询,您需要向我们显示表和索引定义,以及每个表的行计数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果你知道如何进行解释或制定执行计划,那么把结果也放在问题中。第3点正是正确的方向。使用唯一的项目6和项目8单独创建一个表。您将需要执行两个查询,一个查询新表中的精确字符串,另一个查询具有精确字符串匹配的旧表。大多数工作是使该表保持最新。此查询也需要时间处理十亿个条目,但它将大大加快原始选择。只需阅读您的编辑,但问题不是大字符串。小字符串也会发生这种情况。问题是需要使用%string%之类的工具检查数以十亿计的条目。在这方面没有索引会有帮助。因此,由于项6和项8的唯一性,创建具有唯一项的单独表的解决方案可能要小得多,并首先检查它们。@Rik,我认为复杂性取决于x | s |-|关键字|,因此长字符串和行数都会影响结果。但是如果你有数十亿行,那么是的,这就是问题所在。如果使用二进制搜索,搜索数十亿行需要40-50次操作。但我认为问题不在%的情况下。我已将其关闭,然后再次运行查询。但这仍然需要565秒的时间。在这种情况下,按照其他评论的建议去做——提供“解释”。