我正在努力优化MySQL查询,但遇到了一个奇怪的问题。我从不使用实时生产数据库,因此我创建了它的转储并使用mysqldump
将其导入到本地计算机上的数据库中,没有额外的选项。
生产数据库和本地虚拟机上的mysql版本几乎完全相同:
生产: mysql Ver 14.14 Distrib 5.1.61,debian-linux-gnu(x86_64)使用readline 6.2
虚拟机: mysql Ver 14.14 Distrib 5.1.63,debian-linux-gnu(x86_64)使用readline 6.2
这一个查询非常复杂,生产需要大约4-5秒,但在VM上只需不到1秒。我唯一能想到的是,生产数据库上可能存在阻止查询立即运行的锁定,并且查询必须等待锁定?
对每个数据库运行查询时EXTENDED EXPLAIN
几乎相同,只有一点点差异。
我在查询之前使用SQL_NO_CACHE
以确保查询没有达到缓存。
所以我的问题是:
EXTENDED EXPLAIN
有所不同,甚至是轻微的?答案 0 :(得分:2)
有很多事情会影响执行时间:
生产系统上的装载情况如何?你有多少IO余量?如果您的系统正忙于运行其他查询或执行大量IO,则任何查询的性能都将严重受损。
通常,您可以使用SHOW PROCESSLIST
来帮助确定当前正在运行的内容以及iotop
之类的程序,以查看正在进行的IO操作。
您的虚拟机是否正在运行SSD?即使是配备SSD的中端开发机器也会吹掉几乎任何基于HD的数据库服务器,因为它严重依赖于随机访问。
你有没有在生产系统上试过OPTIMIZE TABLE
?执行还原时,表始终会自动优化。在实时系统中,表格会慢慢降低,因为INSERT
和DELETE
行。
确保两者都使用相同的存储引擎。 MyISAM通常比InnoDB更快,但在关键数据的生产环境中使用是不安全的。检查SHOW TABLE STATUS
以查看每个表使用的引擎。您可能有不同的默认值。
同时检查/etc/my.cnf
是否已相应调整。 MySQL的默认配置是糟糕。你真的需要为InnoDB缓冲区分配更多的内存,否则性能会非常糟糕。