【问题标题】:Mysql is very slow vs mariadbMysql 与 mariadb 相比非常慢
【发布时间】:2017-05-07 18:09:51
【问题描述】:

查询

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 秒网络)

我的表是 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 中提高此查询的速度?

mysql和mariadb除了my.ini有什么不同?

【问题讨论】:

  • 简洁的故事。你有什么问题?
  • 为什么这个查询在mysql中速度非常非常慢?除了 my.ini 之外,mysql 和 mariadb 有什么不同?
  • 我猜你可能想要重写查询以执行 inner join 而不是 in subquery 但由于没有 sqlfiddle,我无法确定。

标签: mysql innodb mariadb


【解决方案1】:

考虑迁移到 MySQL 5.7 或将查询重写为

select * from pmt_bolok order by id desc limit 1

至于为什么会发生 - MySQL 5.5 没有子查询结果物化,您的 WHERE 子句中的子查询将针对表中的每一行执行。

【讨论】:

  • select * from pmt_bolok where id in (select max(id) from pmt_bolok group by bolok_row) 没有子查询怎么写这个查询?
【解决方案2】:

IN ( SELECT ... ) 在 5.5 及之前的版本中非常优化得很差。

您有一个Groupwise max 类型的查询。请参阅该链接以在任何版本中获得更好的性能。

至于您的设置,“您无法通过调整来解决性能问题”。但是,假设您使用的是 InnoDB,您应该将 innodb_buffer_pool_size 设置为大约 70% 的可用 RAM。这将有助于所有查询。如果您使用的是 MyISAM,那么您不应该这样做。

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2020-01-05
    • 2015-01-27
    • 2014-09-06
    • 1970-01-01
    • 2019-09-29
    • 2021-10-28
    • 2019-07-26
    相关资源
    最近更新 更多