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