MYSQL解释您检查的行不匹配

MYSQL解释您检查的行不匹配,mysql,performance,query-optimization,Mysql,Performance,Query Optimization,我在mysql\u slow\u querys日志中有一个查询,如下所示: 查询时间:4.642323锁定时间:1.821996行发送:14行检查:27099 现在,当我转到phpMyAdmin并使用EXPLAIN运行相同的查询时,我在这里得到了输出: 我有两个问题: 1为什么日志中检查的行与解释37756中检查的行不同?我是否需要将EXPLAIN中的2个值乘以以检查实际行 2我知道这是一种开放式的查询,但如何改进现有的查询?我已经为groupon_deals.groupon_websites

我在mysql\u slow\u querys日志中有一个查询,如下所示:

查询时间:4.642323锁定时间:1.821996行发送:14行检查:27099

现在,当我转到phpMyAdmin并使用EXPLAIN运行相同的查询时,我在这里得到了输出:

我有两个问题:

1为什么日志中检查的行与解释37756中检查的行不同?我是否需要将EXPLAIN中的2个值乘以以检查实际行

2我知道这是一种开放式的查询,但如何改进现有的查询?我已经为groupon_deals.groupon_websites_id字段编制了索引,我认为可能有某种方法可以改进查询中的NOT IN部分。这里不希望有完整的答案,但知道从哪里开始挖掘/学习吗?

MySQL解释提供了一个估计,一个预测,每个步骤将返回的行数

EXPLAIN真正为您提供的是执行计划,即将使用的访问路径、操作顺序以及将使用的索引。它实际上并不处理语句以获得准确的行数,它只根据表中的行数以及列中值的基数和分布信息预测将检索多少行

根据您提供的解释输出,查询正在对groupon_网站表进行完整扫描。对于检索到的每个未被谓词消除的id值,MySQL正在groupon_deals表的groupon_websites_id列上执行索引查找

对于这个查询,使用索引可以稍微提高性能

... ON groupon_deals (groupon_websites_id, hidden, pubDate, id)
我认为一个开始挖掘的好地方是理解解释的陈述

如果您对MySQL实际上如何处理SQL语句,MySQL可以执行哪些操作,哪些操作可以使用合适的索引,这是理解解释的输出的基础。


我建议从这里开始,在MySQL文档中:

谢谢你的回答,知道解释并没有真正处理语句,而是给出了一个计划,解释了很多没有双关语的地方。
... ON groupon_deals (groupon_websites_id, hidden, pubDate, id)