gpt4 book ai didi

php - 使用 "NOT IN"优化 MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 03:00:47 25 4
gpt4 key购买 nike

我已经看到一些涉及 MySQL 查询中“NOT IN”效率低下的问题,但我没有设法重现所提出的解决方案。

所以我有某种搜索引擎。它从非常简单的查询开始,然后在找不到足够的结果时尝试更复杂的查询。这是它在伪代码中的工作方式

list_of_ids = do_simple_search()
nb_results = size_of(list_of_ids)

if nb_results < max_nb_results :
list_of_ids .= do_search_where_id_not_in(list_of_ids)

if nb_results < max_nb_results :
list_of_ids .= do_complicated_search_where_id_not_in(list_of_ids)

希望我说清楚了。无论如何,这是慢速查询,如 MySQL-slow 所示:

SELECT DISTINCT c.id 
FROM clients c LEFT JOIN communications co ON c.id = co.client_id
WHERE (co.titre LIKE 'S' OR co.contenu LIKE 'S') AND c.id NOT IN(N)
LIMIT N, N

下面是对该查询的解释:

id  select_type     table   type    possible_keys               key         key_len ref             rows    Extra
1 SIMPLE c index PRIMARY PRIMARY 2 NULL 25250 Using where; Using index; Using temporary
1 SIMPLE co ref qui_com,id_client,titre id_client 2 klients.c.id 8 Using where; Distinct

MySQL版本为5.1.63-0ubuntu0.11.04.1-log

也许我的方法在这里是错误的?你会怎么做?谢谢。

最佳答案

几点说明:

1) 为什么要进行 LEFT JOIN i/o (INNER) JOIN? LEFT JOIN 意味着你还想获得与客户端不匹配的记录,这是意图吗?如果不是,则 JOIN i/o LEFT JOIN 更快。

2) 如果您可以简单地执行以下操作,为什么还需要 JOIN:

SELECT DISTINCT co.client_id from communications co 
WHERE (co.titre LIKE 'S' OR co.contenu LIKE 'S') AND co.id!=N LIMIT N,N;

另外,如果你做一个 JOIN,两个连接的字段必须是索引,否则它也很慢。

更重要的是,您从 communications 表中条件化了 client_id 和 id,但是这两者没有共同的索引,这意味着执行查询需要更多工作(因此使用临时,这通常不是一个好兆头)。

3) 你在 co.titre 和 co.contenu 上做了一个复杂的条件,你似乎有索引但没有使用它们。这意味着这部分可能会非常慢。

关于php - 使用 "NOT IN"优化 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com