2016-12-22 12 views
-1

QueryMysql очень медленно по сравнению 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 сек.)

Моя таблица innodb и поле id является первичным ключом.

все равно 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?

+0

Уютная история. Каков твой вопрос? – Moob

+0

Почему скорость этого запроса очень медленная в mysql? За исключением my.ini, что отличается между mysql и mariadb? –

+0

Я предполагаю, что вы можете переписать запрос, чтобы выполнить 'inner join' вместо' in subquery', но так как нет sqlfiddle, я не могу попробовать это. – Kris

ответ

0

Рассмотрим переход к MySQL 5.7 или переписать запрос

select * from pmt_bolok order by id desc limit 1 

А почему это происходит - MySQL 5.5 не имеет подзапрос результат материализации и подзапрос в вашем ИНЕКЕ будет выполняться для каждой строки в Таблица.

+0

'select * from pmt_bolok где id in (выберите max (id) из pmt_bolok group by bolok_row)' как написать этот запрос без подзапроса? –

+0

На самом деле есть пример в ответе выше, используя порядок и ограничение ... – Alexey

0

IN (SELECT ...) оптимизирован очень плохо в 5.5 и ранее.

У вас есть запрос типа Groupwise max. См. Эту ссылку для лучшей производительности в любой версии.

Что касается ваших настроек, «вы не можете настроить свой выход из проблемы с производительностью». Однако, предполагая, что вы используете InnoDB, вы должны установить innodb_buffer_pool_size примерно 70% от доступно Оперативная память. Это поможет всем запросам. Если вы используете MyISAM, ну, не стоит.

 Смежные вопросы

  • Нет связанных вопросов^_^