powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Mysql оптимизатор выбирает некорректный индекс после рестарта
8 сообщений из 8, страница 1 из 1
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39995487
DarthGelos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Такая проблема, есть БД (размер около 1044 ГБ) забикса. Чтобы не бекапить регулярно террабайт данных, сделана реплика, которая регуляррно стопится и снимается снапшот всей ВМ где реплика крутится.

Проблема в том, что иногда, после некоторых бекапов, оптимизатор перестает использовать индекс item_discovery_1 на таблице item_discovery и почему то начинает использовать индекс PRIMARY который вообще тут не при чем.
+----------------+------------+------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------------+------------+------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| item_discovery | 0 | PRIMARY | 1 | itemdiscoveryid | A | 2189577 | NULL | NULL | | BTREE | | |
| item_discovery | 0 | item_discovery_1 | 1 | itemid | A | 2189577 | NULL | NULL | | BTREE | | |
| item_discovery | 0 | item_discovery_1 | 2 | parent_itemid | A | 2189577 | NULL | NULL | | BTREE | | |
| item_discovery | 1 | item_discovery_2 | 1 | parent_itemid | A | 2189577 | NULL | NULL | | BTREE | | |
+----------------+------------+------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

сответственно запросы вида update item_discovery set lastcheck=1596021740 where itemid between 3304480 and 3304487;
начинают выполняться долго, и начинает расти лаг репликации.
Причем, если создать таблицу новую, по образу и подобию item_discovery перелить туда данные и переименовать новую в старую, а старую убрать, то проблема исчезает, оптимизатор тут же начинает использовать правильный индекс.
Воспроизвести проблему не получается, сколько я не ребутал субд и с остановой слейва, и без остановки, после старта все прекрасно работает, но иногда после ночных остановок происходит такая фигня с индексами и приходится пересоздавать таблицу.
Она хоть и не большая, всего 300мб, но хотелось бы найти корневую причину, почему оптимизатор вдруг именно на этой таблице иногда сбивается.
сама таблица такая
SHOW COLUMNS FROM zabbix_nohist.item_discovery;
+-----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| itemdiscoveryid | bigint(20) unsigned | NO | PRI | NULL | |
| itemid | bigint(20) unsigned | NO | MUL | NULL | |
| parent_itemid | bigint(20) unsigned | NO | MUL | NULL | |
| key_ | varchar(255) | NO | | | |
| lastcheck | int(11) | NO | | 0 | |
| ts_delete | int(11) | NO | | 0 | |
+-----------------+---------------------+------+-----+---------+-------+
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39995495
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarthGelos
хотелось бы найти корневую причину, почему оптимизатор вдруг именно на этой таблице иногда сбивается.
Причина всегда одна - устаревшая статистика. А самое простое лечение, если есть убеждённость, какой индекс надо использовать - это force index.
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39995572
DarthGelos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, согласно документации, FORCE INDEX вставляется в тело запроса :( забикс вряд ли обрадуется попыткам что то в нем переписывать.
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39995578
DarthGelos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теоретически, если проблема в устаревшей статистике, то при появлении проблемы, после выполнения команды ANALYZE TABLE zabbix_nohist.item_discovery; оптимизатор должен увидеть правильный индекс?
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39995641
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически - да. Для бОльшей определённости надо видеть как минимум точный текст запроса и CREATE TABLE всех используемых в нём таблиц (а вовсе даже не SHOW COLUMNS - это никому не нужная туфта). А ещё лучше - ещё и статистику по таблице в разрезе используемых связываний и отборов.
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39996459
DarthGelos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Повторилась ошибка
Запрос такой же - update item_discovery set lastcheck=1596021740 where itemid between 3304480 and 3304487;


analyze table не помог, пробовал и при работающем слейве, и погашенном и после рестарта. Все равно индекс используется PRIMARY

analyze update item_discovery set lastcheck=1596021740 where itemid between 3304480 and 3304487;
+------+-------------+----------------+-------+------------------+---------+---------+------+------+------------+----------+------------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra |
+------+-------------+----------------+-------+------------------+---------+---------+------+------+------------+----------+------------+-------------+
| 1 | SIMPLE | item_discovery | index | item_discovery_1 | PRIMARY | 8 | NULL | 1 | 2960155.00 | 100.00 | 0.00 | Using where |
+------+-------------+----------------+-------+------------------+---------+---------+------+------+------------+----------+------------+-------------+

после пересоздания:
DROP TABLE item_discovery_backup;
CREATE TABLE new_item_discovery LIKE item_discovery;
INSERT INTO new_item_discovery SELECT * FROM item_discovery;
RENAME TABLE item_discovery TO item_discovery_backup;
RENAME TABLE new_item_discovery TO item_discovery;

все нормально становится:
analyze update item_discovery set lastcheck=1596021740 where itemid between 3304480 and 3304487;
+------+-------------+----------------+-------+------------------+------------------+---------+------+------+--------+----------+------------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra |
+------+-------------+----------------+-------+------------------+------------------+---------+------+------+--------+----------+------------+-------------+
| 1 | SIMPLE | item_discovery | range | item_discovery_1 | item_discovery_1 | 8 | NULL | 8 | 8.00 | 100.00 | 100.00 | Using where |
+------+-------------+----------------+-------+------------------+------------------+---------+------+------+--------+----------+------------+-------------+


SHOW CREATE TABLE item_discovery\G
*************************** 1. row ***************************
Table: item_discovery
Create Table: CREATE TABLE `item_discovery` (
`itemdiscoveryid` bigint(20) unsigned NOT NULL,
`itemid` bigint(20) unsigned NOT NULL,
`parent_itemid` bigint(20) unsigned NOT NULL,
`key_` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '',
`lastcheck` int(11) NOT NULL DEFAULT '0',
`ts_delete` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`itemdiscoveryid`),
UNIQUE KEY `item_discovery_1` (`itemid`,`parent_itemid`),
KEY `item_discovery_2` (`parent_itemid`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

Можно как то использовать force index без вмешательства в код приложения?
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39996700
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ради эксперимента можно попробовать
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry To always retrieve the latest statistics directly from the storage engine and bypass cached values,
set information_schema_stats_expiry to 0.
...
Рейтинг: 0 / 0
Mysql оптимизатор выбирает некорректный индекс после рестарта
    #39999636
DarthGelos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо вылечено сменой формата бин логов на ROW
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Mysql оптимизатор выбирает некорректный индекс после рестарта
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]