Задать вопрос
Fernus
@Fernus
Техник - Механик :)

MySQL/MariaDB. 10 vs 11 version. Индексы. Странное поведение?

Дано:
Старое ПО:
> 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...мало ли - "братская" проблема между ними...
  • Вопрос задан
  • 1761 просмотр
Подписаться 5 Средний 17 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы