Прискорити вставки MySQL за допомогою розділів на MyISAM за допомогою унікального ключа


9

У мене є велика таблиця MyISAM (~ 30М рядків). У якийсь момент я переключив його на формат фіксованих рядків, тому тепер таблиця займає ~ 40Gb на диску і 2Gb для індексів. Таблиця має унікальний індекс, і є 100 запитів "вставки при повторному оновлення ключа" в секунду. З ростом столу ці вставки стають все повільнішими та повільнішими.

Я не впевнений, але чи допоможуть мені розділи пришвидшити вставки?

Відповіді:


1

Перш за все, одночасне записування, безумовно, не є варіантом зберігання MyISAM. Кожен з них заблокує цілу таблицю (крім читання в деяких випадках). Якщо InnoDB вам не підходить добре, спробуйте TokuDB. Але це буде повільніше порівняно з MyISAM через транзакційний характер двигуна TokuDB (і, звичайно, InnoDB) (ви повинні писати однакові дані хоча б двічі: журнали та файли даних). Крім того, якщо ваш сервер вийде з ладу в якийсь день, ви будете чекати години, поки ваш ремонт 40Gb MyISAM таблиці.

Якщо ви все ще хочете завантажити дані у свої таблиці MyISAM і хочете зробити це швидко, я можу рекомендувати використовувати LOAD DATA INFILE замість вставок. Це найшвидший спосіб завантаження великих обсягів даних у таблицю. І так, індекси сповільнюватимуть ефективність вставки в експоненціальний спосіб.

Слово про розділи: INSERT-заяви в MySQL не підтримують обрізку, тому всі ваші розділи будуть скановані в кожному операторі на предмет унікальної відповідності індексу. Крім того, всі розділи будуть заблоковані до кінця вставлення.


Ще один цікавий двигун: code.facebook.com/posts/190251048047090 / ...
Greywolf

0

Ці запити вставки є одночасними або походять з одного процесу? Якщо вони паралельні, для цієї таблиці краще використовувати сховище InnoDB, оскільки MyISAM блокує всю таблицю, а InnoDB використовує блокування рядків. Якщо перехід на інший сховище не є можливим, ви можете спробувати оператор INSERT DELAYED та ряд інших оптимізацій вставок . Розмежування не допоможе, якщо ви не розмістите різні розділи на різних фізичних дисках.


Ці вставки одночасно. Але InnoDB занадто повільний при "вставленні на оновлення повторюваного ключа", тому це не варіант. Наскільки я можу сказати, IO не є вузьким місцем - кількість RAM >> розміру таблиць, включаючи індекси та кешування записів. Я думаю, що проблема лежить десь у внутрішніх замках mysql чи що-небудь.
d0rc

INSERT DELAYED слід використовувати лише для тверджень INSERT, які задають списки значень. Сервер ігнорує операції DELAYED для INSERT ... SELECT або INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro

"InnoDB занадто повільний" - ви трохи спробували його налаштувати? Налаштування за замовчуванням досить погані.
rvs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.