Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用“优化MySQL查询”;不在「;_Php_Mysql_Sql_Sql Optimization - Fatal编程技术网

Php 使用“优化MySQL查询”;不在「;

Php 使用“优化MySQL查询”;不在「;,php,mysql,sql,sql-optimization,Php,Mysql,Sql,Sql Optimization,我已经看到一些问题涉及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

我已经看到一些问题涉及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)
下面是对这个问题的解释:

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) 为什么要进行左连接i/o(内部)连接?LEFT JOIN意味着您还希望获得与客户端不匹配的记录,这是您的意图吗?如果没有,则联接i/o左联接更快

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

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;
此外,如果进行联接,两个联接的字段都必须是索引,否则也很慢

更重要的是,您可以从通信表中对客户机id和id进行条件设置,但这两个都没有通用索引,这意味着执行查询需要做更多的工作(因此
使用临时
,这通常不是一个好迹象)


3) 您对co.titre和co.contenu都执行了复杂的条件,您似乎有索引,但没有使用它们。这意味着此部分可能会非常慢。

是否存在性能问题?如果希望我们帮助优化查询,需要向我们显示表和索引定义,以及每个表的行计数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果您知道如何进行
解释
或获得执行计划,请将结果也放在问题中。如果你没有索引,请尽快访问。谢谢你的提醒,我会尝试自己找出一点,然后回来哦,哇,我不敢相信我忽略了我不需要加入。非常感谢,这真的很简单。该死,我才意识到我为什么要加入。在某些情况下,我也在检查客户的状态。所以你建议我用连接替换我的左连接。SQL从来都不是我的强项:/I我是这样想的。当然,您仍然可以加入clients表并使用其中的字段。
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;