Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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_Database_Join_Indexing - Fatal编程技术网

同一Mysql数据库的两个实例之间的连接顺序不同

同一Mysql数据库的两个实例之间的连接顺序不同,mysql,database,join,indexing,Mysql,Database,Join,Indexing,我想优化一个查询。为了进行一些测试,我拍摄了生产数据库的快照,并为此数据库创建了一个新的测试实例。使用explain子句,我可以看到两个数据库之间连接的顺序不同。这两个数据库具有相同的版本MySQL 5.6.19a、相同的引擎InnoDB、相同的模式、相同的索引、相同的数据,并且在相同的材料上执行。唯一的区别是,生产数据库显然使用了更多的内存,因为它有更多的连接 什么可能导致联接顺序不同? 内存使用情况? 索引仍在测试实例中生成? 生产数据库的索引是零碎的?这很少见,但非常可行。InnoDB对每

我想优化一个查询。为了进行一些测试,我拍摄了生产数据库的快照,并为此数据库创建了一个新的测试实例。使用explain子句,我可以看到两个数据库之间连接的顺序不同。这两个数据库具有相同的版本MySQL 5.6.19a、相同的引擎InnoDB、相同的模式、相同的索引、相同的数据,并且在相同的材料上执行。唯一的区别是,生产数据库显然使用了更多的内存,因为它有更多的连接

什么可能导致联接顺序不同? 内存使用情况? 索引仍在测试实例中生成?
生产数据库的索引是零碎的?

这很少见,但非常可行。InnoDB对每个表上的每个索引都有统计信息;它使用它们来决定执行查询的最佳方式,包括查看表的顺序

过去的统计数据来自8次“随机”潜入BTree,以粗略了解行数和数据分布。跳水的时机、数字“8”和随机性都受到了批评,并逐渐得到改善。5.6.19中仅存在一些改进

此外,决定如何执行查询的成本模型最近也进行了5.7/8.0的大修。8.0和10.0有直方图,这将导致更好的查询计划选择。从8.0.0开始尚未实现:注意哪些块已经被缓存;这可能会选择一个“更糟糕”的索引,因为缓存的索引越多,因此速度就越快

由于优化问题的复杂性和大量的可能性,甚至在某些情况下,更新版本会选择更糟糕的查询计划

即使在同一台计算机上运行相同的查询,查询计划也可能不同

我假定您已经知道,更改查询中的常量可以更改查询计划,并且可以做得更好。我看到同一个查询产生了6种不同的查询计划,可能是由于不同的常量。如果您正在对slowlog中找到的查询进行解释,这可能会很烦人-您无法确定该查询计划是否在运行缓慢时使用

我们必须忍受这一切

您可以通过分析表来重新计算统计数据。但这可能使事情变得更糟或更好,这取决于月亮的相位。它甚至可能巧合地使您的两个实例执行相同的查询

真正的问题是,一台服务器运行查询的速度是否明显快于另一台?在考虑缓存、其他活动等之后

当联接中的两个表都在WHERE中进行筛选时,优化器很难做出决定。如果还存在“按顺序”和“限制”,则更难作出决定

如果您想提供选择、解释和显示创建表,我们可以讨论详细信息。但是,请开始一个新问题。

您所说的加入顺序是什么意思?如果您的查询为:选择。。。从B.id=A.id_B连接B.id=A.id_B连接C.id=A.id_C你可以先在B上连接A,然后在C上,或者先在A上连接C,然后在B上等等。。。通常引擎会尝试确定限制要读取的行数的顺序等。谢谢,使用ANALYZE TABLE重新计算统计信息有助于我获得相同的连接顺序。就信息而言,它让事情变得更糟。但我想处于同样的情况,所以没关系。