Spec-Zone .ru
спецификации, руководства, описания, API
|
Эти подсказки по производительности добавляют общие руководящие принципы для быстрых вставок в Разделе
8.2.2.1, "Скорость INSERT
Операторы".
Чтобы улучшить производительность, когда многократные клиенты вставляют много
строк, используйте INSERT
DELAYED
оператор. См. Раздел
13.2.5.2,"INSERT DELAYED
Синтаксис". Этот метод работает
на MyISAM
и некоторые другие механизмы хранения, но нет InnoDB
.
С MySQL 5.6.6, INSERT
DELAYED
осуждается, и будет удален в будущем выпуске. Использовать INSERT
(без DELAYED
) вместо этого.
Для a MyISAM
таблица, можно использовать параллельные
вставки, чтобы добавить строки в то же самое время, когда SELECT
операторы работают, если нет никаких удаленных строк в
середине файла данных. См. Раздел 8.10.3, "Параллельные
Вставки".
С некоторой дополнительной работой возможно сделать LOAD DATA INFILE
выполненный еще быстрее для a MyISAM
таблица, когда у таблицы есть многие, индексирует. Используйте следующую процедуру:
Выполните a FLUSH
TABLES
оператор или mysqladmin команда таблиц сброса.
Используйте myisamchk - keys-used=0 - запрос /path/to/db/tbl_name
удалить все использование индексирует для таблицы.
Вставьте данные в таблицу с LOAD DATA INFILE
. Это не обновляет, любой индексирует и
поэтому очень быстр.
Если Вы намереваетесь только читать из таблицы в будущем, используйте myisampack, чтобы сжать это. См. Раздел 14.3.3.3, "Сжатые Табличные Характеристики".
Воссоздайте индексирование с myisamchk - запрос /path/to/db/tbl_name
.
Это создает индексировать дерево в памяти прежде, чем записать это в диск, который намного
быстрее что обновление индексирования во время LOAD DATA INFILE
потому что это избегает большого поиска
на диске. Получающиеся индексируют дерево, также отлично балансируется.
Выполните a FLUSH
TABLES
оператор или mysqladmin команда таблиц сброса.
LOAD DATA INFILE
выполняет предыдущую оптимизацию автоматически если
MyISAM
таблица, в которую Вы вставляете данные, пуста. Основное
различие между автоматической оптимизацией и использованием процедуры явно - то, что можно позволить
myisamchk
выделять намного более временную память для создания индекса, чем Вы могли бы хотеть, чтобы сервер
выделил для, индексируют воссоздание, когда это выполняется LOAD DATA INFILE
оператор.
Можно также отключить или включить групповому, индексирует для a MyISAM
таблица при использовании следующих операторов, а не myisamchk. Если Вы используете эти операторы,
можно пропустить FLUSH TABLE
операции:
ALTER TABLEtbl_name
DISABLE KEYS;ALTER TABLEtbl_name
ENABLE KEYS;
Убыстряться INSERT
операции, которые выполняются с многократными операторами для
нетранзакционных таблиц, блокируют Ваши таблицы:
LOCK TABLES a WRITE;INSERT INTO a VALUES (1,23),(2,34),(4,33);INSERT INTO a VALUES (8,26),(6,29);...UNLOCK TABLES;
Это приносит пользу производительности, потому что индексный буфер сбрасывается к диску только
однажды в конце концов INSERT
операторы завершились. Обычно, было бы так много сбросов индексного буфера, как есть INSERT
операторы. Явные операторы блокировки не необходимы, если
можно вставить все строки с синглом INSERT
.
Блокировка также понижает полное время для тестов многократного соединения, хотя максимальное время ожидания для отдельных соединений могло бы восстановить работоспособность, потому что они ожидают блокировок. Предположите, что пять клиентов пытаются выполнить, вставляет одновременно следующим образом:
Соединение 1 делает 1000, вставляет
Соединения 2, 3, и 4 делают 1, вставляют
Соединение 5 делает 1000, вставляет
Если Вы не используете блокировку, соединения 2, 3, и 4 конца прежде 1 и 5. Если Вы используете блокировку, соединения 2, 3, и 4, вероятно, не заканчиваются, прежде 1 или 5, но полное время должно быть приблизительно на 40 % быстрее.
INSERT
,
UPDATE
,
и DELETE
операции очень быстры в MySQL, но можно получить лучшую общую производительность, добавляя
блокировки вокруг всего, что делает больше чем приблизительно пять последовательных вставок или
обновления. Если Вы делаете очень много последовательных вставок, Вы могли бы сделать a LOCK
TABLES
сопровождаемый UNLOCK TABLES
время от времени (каждый приблизительно 1 000
строк), чтобы разрешить другим потокам получать доступ к таблице. Это все еще привело бы к хорошему
увеличению производительности.
INSERT
все еще намного медленнее для того, чтобы загрузить данные чем LOAD DATA INFILE
, даже когда использование стратегий только
обрисовывается в общих чертах.
Увеличить производительность для MyISAM
таблицы, для
обоих LOAD DATA INFILE
и INSERT
, увеличьте ключевой кэш, увеличиваясь key_buffer_size
системная переменная. См. Раздел
8.11.2, "Настраивая Параметры Сервера".