在空数据库上解释计划 MySQL

Explain plan MySQL on empty database

我在 MySQL 5.6(+ Percona 工具包)中有一个数据库模式的副本,因为我必须评估应用程序查询的性能(并报告它们以便采取措施用于优化 queries/schema)。此模式(出于安全原因)未填充数据,原始表可能有 100k-10 条记录。

我运行解释查询(使用MySQL Workbench 6.3),但似乎没有用,因为它没有显示所有分析。示例:对连接三个表的(已知工作)Select 查询的解释显示消息 "Impossible where noticed after reading const tables".

所以,问题是:

这取决于查询,但是,是的,我经常建议您需要用一些示例数据填充 table 以获得准确的 EXPLAIN 报告。

即使您填充 1 行以避免出现 "impossible where" 注释,这也不够好,因为优化器可能会对行数很少的 table 进行特殊处理。也就是说,优化器知道这么小的 table 无论如何都适合单页存储,而存储引擎将检索的最小单位是一页,因此它可能会执行 "table scan" 而不是使用索引,而如果 table 有几千行,则对同一查询使用索引很重要。

您不一定需要用真实的敏感数据填充 table。编写脚本生成与您的真实数据 相似 的无意义数据是很常见的,足以填充 table 以便您进行测试。

您不一定需要填充 100k 行数据才能让 EXPLAIN 向您显示它将用于那么多数据的相同优化程序计划。如果你能用几百或几千行的人工数据填充 table 就足够了。