【发布时间】:2014-06-05 14:22:27
【问题描述】:
我已经看到一些涉及 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
也许我的方法在这里是错误的?你会怎么做?谢谢。
【问题讨论】:
-
您有性能问题吗?
-
如果您希望我们帮助优化查询,您需要向我们展示表和索引定义,以及每个表的行数。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果您知道如何执行
EXPLAIN或获取执行计划,请将结果也放入问题中。如果您没有索引,请尽快访问use-the-index-luke.com。 -
感谢您的提醒,我会尝试自己弄清楚然后回来
标签: php mysql sql sql-optimization