Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
Mysql 为什么这个子查询要进行表扫描?_Mysql_Sql - Fatal编程技术网

Mysql 为什么这个子查询要进行表扫描?

Mysql 为什么这个子查询要进行表扫描?,mysql,sql,Mysql,Sql,我有以下两个查询,它们基本相同,ID列表(主键)是其中一个查询的结果-- 它正在对该查询执行完整的表扫描,而它似乎应该只通过子查询中的PK进行搜索,然后(再次)在外部查询中搜索PK,这似乎很疯狂 为什么mysql的执行计划会这样做?除了预取ID(即两个查询而不是一个查询)之外,还有什么方法可以修复它吗?表扫描可能是最快的查找方法,尤其是如果整个表都缓存在RAM中(通常是这样的情况) 当表在内存中,并且索引没有或不完整时,进行扫描比从硬盘上加载索引更便宜 尝试更新表上的统计信息,看看是否得到相同

我有以下两个查询,它们基本相同,ID列表(主键)是其中一个查询的结果--

它正在对该查询执行完整的表扫描,而它似乎应该只通过子查询中的PK进行搜索,然后(再次)在外部查询中搜索PK,这似乎很疯狂


为什么mysql的执行计划会这样做?除了预取ID(即两个查询而不是一个查询)之外,还有什么方法可以修复它吗?

表扫描可能是最快的查找方法,尤其是如果整个表都缓存在RAM中(通常是这样的情况)

当表在内存中,并且索引没有或不完整时,进行扫描比从硬盘上加载索引更便宜

尝试更新表上的统计信息,看看是否得到相同的结果

ANALYZE TABLE table_name;

为了进一步提供帮助,您可能还应该发布mysql版本和表结构之类的内容。

您可以为mysql指定将使用什么索引。这不是很优雅,但在极少数情况下,这一决定是合理的。

您的查询全部是3行短线。当你几乎可以立即剪切/粘贴实际的查询文本时,为什么还要麻烦地制作一个不可读的屏幕截图呢?我相信MySQL在涉及ORs时会遇到利用索引的问题
UNION
s近重复的
SELECT
s(以及不同的条件)通常是解决方案。此外,在适用的情况下,
JOIN
s往往比
WHERE
子句中的subselect表现更好。您有足够高的rep来理解如何正确编写问题。这个屏幕截图最多也看不懂……当您运行
show create table main\u iteminstance
时,您的输出是什么?一个更好的问题是“我的查询运行得有多快,是否值得花时间对SQL优化器进行微观管理?”