下面的查询在我运行它时会产生两个不同的结果,而不是同事运行它时:
explain select *
from `mydatabase`.`Transactions` as `transaction`
join `mydatabase`.`Documents` as `document` on `document`.`version` = `transaction`.`documentVersion`
join `mydatabase`.`DocumentTopics` as `documentTopic` on `documentTopic`.`documentId` = `document`.`documentId`
join `mydatabase`.`Topics` on `mydatabase`.`Topics`.`id` = `documentTopic`.`topicID`
where `mydatabase`.`Topics`.`id` in (1,2)
and `transaction`.`userHash` = 'xxxxx';在我的机器上:

在我的同事机器上:

那么为什么它要在我的机器上执行全表扫描,而不是在我的同事机器上呢?
我们在Mac上使用的都是带有完全相同的数据库转储的dockerized MySQL 5.7.33。
这怎麽可能?
发布于 2021-03-01 23:20:55
优化器选择的索引是基于InnoDB为表和索引保存的统计信息。
这些统计信息是由InnoDB从表读取页的随机样本并推断索引基数之类的东西来定期生成的,因此它可以决定索引是否值得使用。
有时,统计数据是基于数据的不对称抽样,因此统计数据不具有代表性。
我建议您在两个MySQL容器中运行ANALYZE TABLE Transactions,然后再次尝试该实验。这条语句将使InnoDB根据新的随机页面样本刷新该表的统计信息。
https://stackoverflow.com/questions/66424731
复制相似问题