Mysql 与 mariadb 相比非常慢
Mysql is very slow vs mariadb
查询
select * from pmt_bolok
where id in (select max(id) from pmt_bolok
group by bolok_row)
MariaDB(10.0.17) 中的这个查询在 0.094 秒内执行得非常好。 (+ 0.047 秒网络)
但在 mysql(5.5.32) 在 00:05:44 秒内非常慢。 (+ 478 秒网络)
我的table是innodb,id
字段是主键
除端口和mysql路径外,所有my.ini都相等
[client]
port = 3306
socket = "C:/xampp/mysql/mysql.sock"
[mysqld]
autocommit=1
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql"
tmpdir = "C:/xampp/tmp"
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 16M
max_allowed_packet = 1M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"
plugin_dir = "C:/xampp/mysql/lib/plugin/"
server-id = 1
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
问题:
为什么这个查询的速度在 mysql 中非常非常慢?
如何在 mysql 中提高此查询的速度?
除了 my.ini mysql 和 mariadb 有什么不同?
考虑迁移至 MySQL 5.7 或将您的查询重写为
select * from pmt_bolok order by id desc limit 1
至于为什么会发生 - MySQL 5.5 没有子查询结果具体化,WHERE 子句中的子查询将针对 table 中的每一行执行。
IN ( SELECT ... )
优化非常 在 5.5 和之前的版本中很差。
您有一个 Groupwise max 类型的查询。请参阅 link 以在任何版本中获得更好的性能。
至于你的设置,"you cannot tune your way out of a performance problem"。但是,假设您使用的是 InnoDB,则应将 innodb_buffer_pool_size
设置为 available RAM 的大约 70%。这将有助于所有查询。如果您正在使用 MyISAM,那么,您不应该这样做。
查询
select * from pmt_bolok
where id in (select max(id) from pmt_bolok
group by bolok_row)
MariaDB(10.0.17) 中的这个查询在 0.094 秒内执行得非常好。 (+ 0.047 秒网络)
但在 mysql(5.5.32) 在 00:05:44 秒内非常慢。 (+ 478 秒网络)
我的table是innodb,id
字段是主键
除端口和mysql路径外,所有my.ini都相等
[client]
port = 3306
socket = "C:/xampp/mysql/mysql.sock"
[mysqld]
autocommit=1
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql"
tmpdir = "C:/xampp/tmp"
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 16M
max_allowed_packet = 1M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"
plugin_dir = "C:/xampp/mysql/lib/plugin/"
server-id = 1
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
问题:
为什么这个查询的速度在 mysql 中非常非常慢?
如何在 mysql 中提高此查询的速度?
除了 my.ini mysql 和 mariadb 有什么不同?
考虑迁移至 MySQL 5.7 或将您的查询重写为
select * from pmt_bolok order by id desc limit 1
至于为什么会发生 - MySQL 5.5 没有子查询结果具体化,WHERE 子句中的子查询将针对 table 中的每一行执行。
IN ( SELECT ... )
优化非常 在 5.5 和之前的版本中很差。
您有一个 Groupwise max 类型的查询。请参阅 link 以在任何版本中获得更好的性能。
至于你的设置,"you cannot tune your way out of a performance problem"。但是,假设您使用的是 InnoDB,则应将 innodb_buffer_pool_size
设置为 available RAM 的大约 70%。这将有助于所有查询。如果您正在使用 MyISAM,那么,您不应该这样做。