Дано:
Старое ПО:
> select version();
+----------------+
| version() |
+----------------+
| 10.5.7-MariaDB |
+----------------+
Новое ПО:
> select version();
+--------------------+
| version() |
+--------------------+
| 11.4.4-MariaDB-log |
+--------------------+
Есть такая структура:
Таблицы:
-
table_firms (id, name) - ~
300 записей;
-
table_models (id, firm_id, name) - ~
4000 записей (индексы: firm_id);
-
table_data (id, supplier_id, deleted_at, xml_id, price) - некоторые поля удалены(не имеющие отношения к делу) - ~
7-10 млн записей (индексы: supplier_id_deleted_at_xml_id_price -
составной);
-
table_data_model (data_id, model_id) - ~
7-15 млн записей(индексы: data_id, model_id).
Есть такой запрос:
select DISTINCT table_firms.*
from `table_firms`
inner join `table_models` on `table_firms`.`id` = `table_models`.`firm_id`
inner join `table_data_model` on `table_models`.`id` = `table_data_model`.`model_id`
inner join `table_data` on `table_data_model`.`data_id` = `table_data`.`id`
where (`table_data`.`supplier_id` in (...куча_id'шников_...))
and `table_data`.`deleted_at` is null
order by `table_firms`.`name` asc;
Теперь есть выдача EXPLAIN:
10.5.7-MariaDB:
+------+-------------+---------------+--------+---------------------------------------------+----------+---------+----------------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------------+--------+---------------------------------------------+----------+---------+----------------------------------+------+---------------------------------+
| 1 | SIMPLE | table_firms | ALL | PRIMARY | NULL | NULL | NULL | 165 | Using temporary; Using filesort |
| 1 | SIMPLE | table_models | ref | PRIMARY,firm_id_url,firm_id | firm_id | 4 | database_db.table_firms.id | 43 | Using index; Distinct |
| 1 | SIMPLE | table_data_model | ref | data_id,model_id | model_id | 4 | database_db.table_models.id | 1342 | Using index condition; Distinct |
| 1 | SIMPLE | table_data | eq_ref | PRIMARY,supplier_id_deleted_at_xml_id_price | PRIMARY | 4 | database_db.table_data_model.data_id | 1 | Using where; Distinct |
+------+-------------+---------------+--------+---------------------------------------------+----------+---------+----------------------------------+------+---------------------------------+
11.4.4-MariaDB-log:
+------+-------------+---------------+--------+---------------------------------------------+-------------------------------------+---------+-----------------------------------+---------+-----------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------------+--------+---------------------------------------------+-------------------------------------+---------+-----------------------------------+---------+-----------------------------------------------------------+
| 1 | SIMPLE | table_data | index | PRIMARY,supplier_id_deleted_at_xml_id_price | supplier_id_deleted_at_xml_id_price | 784 | NULL | 7546020 | Using where; Using index; Using temporary; Using filesort |
| 1 | SIMPLE | table_data_model | ref | data_id,model_id | model_id | 4 | database_db.table_data.id | 1 | Using index |
| 1 | SIMPLE | table_models | eq_ref | PRIMARY,firm_id_url,firm_id | PRIMARY | 4 | database_db.table_data_model.model_id | 1 | Using where |
| 1 | SIMPLE | table_firms | eq_ref | PRIMARY | PRIMARY | 4 | database_db.table_models.firm_id | 1 | Using where |
+------+-------------+---------------+--------+---------------------------------------------+-------------------------------------+---------+-----------------------------------+---------+-----------------------------------------------------------+
Условия:
Бекап и данные полностью идентичные между 10 и 11 версиями...+ CPU и RAM идентичны.
Разница между 10 версией(
0.8сек) и 11(
около минуты)
при тех же настройках my.cfg...
Если в 11 версии задать такой запрос:
select DISTINCT table_firms.*
from `table_firms`
inner join `table_models` USE INDEX(`firm_id`) on `table_firms`.`id` = `table_models`.`firm_id`
inner join `table_data_model` on `table_models`.`id` = `table_data_model`.`model_id`
inner join `table_data` on `table_data_model`.`data_id` = `table_data`.`id`
where (`table_data`.`supplier_id` in (...куча_id'шников_...))
and `table_data`.`deleted_at` is null
order by `table_firms`.`name` asc;
То EXPLAIN прям один в один с версией 10.
Вопрос:
Где я "дурак" ?
Если прочитав про 11 версию, там написано:
Цитата:
В заключение, MariaDB 11 представляет собой значительный шаг вперед в MariaDB, предлагая новые функции, улучшения производительности и более современный подход к управлению базами данных. Хотя MariaDB 10 остается жизнеспособным вариантом, MariaDB 11 является рекомендуемым выбором для пользователей, ищущих последние достижения и долгосрочную поддержку.
Либо я изначально где-то "вспышку" не познал? O_o
P.S.:
USE INDEX решает эту ситуацию в 11 версии...
в последнем запросе обратите внимание...просто:
почему ЁКЛМН так-то?
UPD:
ОС разные...но вряд ли причина в этом...
UPD2:
Добавил обратно тег MySQL...мало ли - "братская" проблема между ними...