Определить статус индекса в MySQL - PullRequest
4 голосов
/ 03 октября 2010

Я создал новый индекс для таблицы с 35 миллионами записей, и он работает уже почти 1 день.Ранее, когда я создавал индексы, это занимало 20 минут, но столбцы были плавающими.Новый idnex находится на varchar (45)

Я использовал команду processlist, которая показывает, что создание индекса еще продолжается, со следующим выводом

65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)

Мне было интересно, если кто-нибудь мог датьЯ советую выяснить, действительно ли запрос мертв и просто сидит в списке процессов.Может быть, что-то пошло не так на каком-то этапе, и я не знаю.

Спасибо

Ответы [ 2 ]

7 голосов
/ 03 октября 2010

Ваш индекс строится, но очень медленно.

В MySQL есть два метода для создания индексов:

  1. путем сортировки.Это самый быстрый метод, но он занимает много памяти.
  2. с помощью keycache.Медленно, медленно, медленно - но занимает мало памяти.

Метод кэширования клавиш немного похож на сортировку вставкой: значения вставляются в индекс по одному за раз.Это тот же метод, который используется сервером, когда оператор INSERT используется для добавления строк в таблицу.

Метод сортировки сортирует все значения с помощью быстрой сортировки, а затем строит из этого индекс.Это очень быстро, но требует много памяти и временного дискового пространства.

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

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_myisam_max_sort_file_size

В Linux вы можете отслеживать ход восстановления индекса, проверяя размер временных файлов, которые используются для построения индекса.Следующая команда выведет список всех файлов, которые остаются открытыми процессом MySQL:

sudo ls -l /proc/[mysql-pid]/fd  

Затем проверьте размер файлов с хешами в их именах - это временные файлы.

2 голосов
/ 03 октября 2010

Имейте в виду, что размер индекса будет не менее 35M * 45. Если это столбец utf8, то он будет 35M * 45 * 3. Это более 4 концертов! Если у вас нет тонны оперативной памяти для поддержки, то вам придется много обращаться к диску и реально снизить производительность.

Можете ли вы преобразовать этот столбец в другую таблицу?

Если нет, то значения, как правило, достаточно сильно различаются, скажем, в первых 8 символах? Возможно, вам удастся с легкостью просто индексировать первые 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...