Spec-Zone.ru › MySQL 9.2

10.6.1 Оптимизация запросов MyISAM

Некоторые общие советы для ускорения запросов к таблицам MyISAM:

  • Для того, чтобы MySQL лучше оптимизировал запросы, используйте ANALYZE TABLE или выполните myisamchk --analyze для таблицы после её заполнения данными. Это обновит значение для каждого элемента индекса, указывающее среднее количество строк, имеющих одинаковое значение. (Для уникальных индексов это всегда 1.) MySQL использует это для определения, какой индекс выбрать при объединении двух таблиц на основе неконстантного выражения. Результат анализа таблицы можно проверить, используя SHOW INDEX FROM tbl_name и проверив значение Cardinality. myisamchk --description --verbose отображает информацию о распределении индексов.

  • Для сортировки индекса и данных по индексу используйте myisamchk --sort-index --sort-records=1 (предполагая, что сортировка производится по первому индексу). Это хороший способ ускорить запросы, если у вас есть уникальный индекс, по которому вы хотите прочитать все строки в порядке сортировки по индексу. В первый раз при сортировке большой таблицы это может занять много времени.

  • Старайтесь избегать сложных SELECT запросов к таблицам MyISAM, которые часто обновляются, чтобы избежать проблем с блокировкой таблицы, возникающих из-за конкуренции между читателями и записывателями.

  • MyISAM поддерживает одновременные вставки: если в таблице нет свободных блоков посередине файла данных, вы можете INSERT новые строки в неё одновременно с другими потоками, которые считывают данные из таблицы. Если это важно, рассмотрите способы использования таблицы, избегая удаления строк. Ещё один вариант – выполнить OPTIMIZE TABLE для дефрагментации таблицы после удаления большого количества строк. Это поведение изменяется настройкой переменной concurrent_insert. Вы можете принудительно добавлять новые строки в конец (и тем самым разрешить одновременные вставки) даже в таблицах, содержащих удалённые строки. Смотрите Раздел 10.11.3, «Одновременные вставки».

  • Для таблиц MyISAM, которые часто изменяются, старайтесь избегать всех столбцов переменной длины (VARCHAR, BLOB и TEXT). Таблица использует динамический формат строк, если содержит хотя бы один столбец переменной длины. Смотрите Главу 18, Альтернативные движки хранения.

  • Обычно нецелесообразно разделять таблицу на несколько таблиц только потому, что строки становятся большими. При доступе к строке основным фактором влияния на производительность является дисковый поиск, необходимый для нахождения первого байта строки. После нахождения данных большинство современных дисков могут достаточно быстро прочитать всю строку для большинства приложений. Единственные случаи, когда разделение таблицы заметно улучшает производительность, это если это таблица MyISAM, использующая динамический формат строк, которую можно изменить на фиксированный размер строки, или если вы очень часто нуждаетесь в сканировании таблицы, но не нуждаетесь в большинстве столбцов. Смотрите Главу 18, Альтернативные движки хранения.

  • Используйте ALTER TABLE ... ORDER BY expr1, expr2, ..., если вы обычно извлекаете строки в expr1, expr2, ... порядке. Используя этот параметр после значительных изменений в таблице, вы можете получить более высокую производительность.

  • Если вам часто нужно вычислять результаты, такие как количество, основанные на информации из множества строк, предпочтительнее создать новую таблицу и обновлять счётчик в реальном времени. Обновление следующего вида очень быстро:

    UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
    

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

  • Периодически используйте OPTIMIZE TABLE чтобы избежать фрагментации с динамическими таблицами MyISAM. Смотрите Раздел 18.2.3, «Форматы хранения таблиц MyISAM».

  • Объявление таблицы MyISAM с опцией таблицы DELAY_KEY_WRITE=1 ускоряет обновление индексов, потому что они не записываются на диск до закрытия таблицы. Недостаток в том, что если что-то завершит работу сервера, пока такая таблица открыта, вам нужно убедиться, что таблица в порядке, запустив сервер с переменной myisam_recover_options установленной или выполнив myisamchk перед перезапуском сервера. (Однако, даже в этом случае вы ничего не потеряете, используя DELAY_KEY_WRITE, потому что ключевую информацию всегда можно получить из строк данных.)

  • Строки автоматически сжимаются по префиксу и окончанию в индексах MyISAM. Смотрите Раздел 15.1.15, «CREATE INDEX Statement».

  • Вы можете повысить производительность, кэшируя запросы или ответы в своём приложении и затем выполняя множество вставок или обновлений вместе. Блокирование таблицы во время этой операции гарантирует, что кэш индексов будет очищен только один раз после всех обновлений.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/optimizing-queries-myisam.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API