8.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 (предполагается, что вы хотите сортировать по индексу 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_nameSETcount_col=count_col+1 WHEREkey_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.