Spec-Zone.ru › MySQL 5.7

8.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 (предполагается, что вы хотите сортировать по индексу 1). Это хороший способ ускорить запросы, если у вас есть уникальный индекс, из которого вы хотите прочитать все строки в порядке, соответствующем индексу. В первый раз при сортировке большой таблицы это может занять много времени.

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

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

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

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

  • Используйте 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 с динамическим форматом. См. Раздел 15.2.3, «Форматы хранения таблиц MyISAM».

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

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

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

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

Spec-Zone.ru

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