Определите статус индекса в MySQL
-
27-09-2019 - |
Вопрос
Я создал новый индекс на столе с 35 миллионов записей, и сейчас проводится почти 1 день. Ранее, когда я создал индексы, потребовалось 20 минут, там были столбцы, однако, плавающие. Новый IDNEX находится на Varchar (45)
Я использовал команду ProcessList, которая показывает создание индекса, все еще выполняется в следующем выходе
65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)
Мне было интересно, может ли кто-нибудь дать мне совет по выяснению, если запрос на самом деле мертв и просто сидит в списке процессов. Может быть, что-то пошло не так на некотором этапе, и я не знаю.
Спасибо
Решение
Ваш индекс строится, но очень медленно.
MySQL имеет два метода для строительства индексов:
- сортировка. Это самый быстрый метод, но использует много памяти.
- ключей Keycache. Медленный, медленный, медленный - но использует небольшую память.
Метод KeyCace немного похоже на сортировку вставки: значения вставляются в индекс один за раз. Это тот же метод, используемый сервером, когда оператор INSERT используется для добавления строк в таблицу.
Метод сортировки сортирует все значения, используя QuickSort, а затем создают индекс от этого. Это очень быстро, но требует много памяти и временного дискового пространства.
Некоторые переменные сервера могут увеличить пространство, доступное для метода сортировки, поэтому позволяет ему работать с большим количеством таблиц. Смотрите myisam_max_sort_file_size.
В Linux вы можете отслеживать ход восстановления индекса, проверив размер временных файлов, которые используются для создания индекса. Следующая команда будет перечислять все файлы, открытые с помощью процесса MySQL:
sudo ls -l /proc/[mysql-pid]/fd
Затем проверьте размер с хэшими в их имя - это временные файлы.
Другие советы
Имейте в виду, что размер индекса будет 35 м * 45, по меньшей мере. Если это столбец UTF8, то будет 35 м * 45 * 3. Это более 4 гигов! Если у вас нет тонн RAM, чтобы поддержать, что он должен будет делать много доступа к диску и действительно убивать производительность.
Можете ли вы нормализовать этот столбец в другой стол?
Если не сделают значения, как правило, варьируются достаточно, говорят первые 8 символов? Возможно, вы сможете сойти с простой индексацией первых 8, затем.