10.6.1 Оптимизация запросов MyISAM
Некоторые общие советы для ускорения запросов к таблицам MyISAM:
Для того, чтобы MySQL лучше оптимизировал запросы, используйте
ANALYZE TABLEили выполните myisamchk --analyze для таблицы после её заполнения данными. Это обновит значение для каждого элемента индекса, указывающее среднее количество строк, имеющих одинаковое значение. (Для уникальных индексов это всегда 1.) MySQL использует это для определения, какой индекс выбрать при объединении двух таблиц на основе неконстантного выражения. Результат анализа таблицы можно проверить, используяSHOW INDEX FROMи проверив значениеtbl_nameCardinality. 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_nameSETcount_col=count_col+1 WHEREkey_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.