Як поліпшити продуктивність MySQL INSERT та UPDATE?


14

Це питання, ймовірно, можна задати і на StackOverflow, але я спробую тут спершу ...

Ефективність тверджень INSERT та UPDATE у нашій базі даних, здається, принижує якість та спричиняє низьку ефективність роботи нашого веб-додатку.

Таблиці є InnoDB, і додаток використовує транзакції. Чи є якісь легкі налаштування, які я можу зробити, щоб прискорити справи?

Я думаю, що ми можемо побачити деякі проблеми з блокуванням, як я можу це дізнатися?


Краще на dba.stackexchange.com
Pacerier

Відповіді:


25
  1. Перевірте, чи правильно налаштовано та налаштовано обладнання та ОС:

    • Джерело проблеми (CPU / IO / Memory / Swap Usage). У вас багато ВГД? Чи завантажений процесор? Якщо ви багато читаєте IOP, напевно, вам не вистачає великого InnoDB buffer_pool. Якщо CPU завантажений, ймовірно, ваші запити сканують повну таблицю замість належних індексів.
    • Налаштування диска / RAID / LVM. У деяких конкретних налаштуваннях LVM-смуга може принести вам користь, вирівнюючи завантаження диска (немає апаратного RAID, підключено кілька LUNS)
    • Планувальник IO: коли у вас хороший апаратний RAID-контролер, мабуть, noop є найкращим. RedHat зробив кілька тестів, і вони сказали, що для Oracle (та інших DB) CFQ - найкращий вибір. Вам потрібно запустити деякі орієнтири (наприклад, tpc-c або tpc-e) і вибрати, що найкраще підходить для вашого обладнання.
    • Хороша файлова система - ext3 не працює в конкретних навантаженнях бази даних. Краще - XFS або OCFS2. Вам знову потрібні деякі орієнтири.
    • Слідкуйте, якщо ваша система використовує своп. Використання swap погіршує продуктивність mysql .
  2. Перевірте, чи правильно налаштовано ваш примірник MySQL / InnoDB:

    • розмір буферного пулу - кешування сторінок даних у пам'яті
    • innodb_flush_method = O_DIRECT - уникайте подвійного буферизації IO
    • збільшити розмір файлу журналу InnoDB - для інтенсивного навантаження для запису це може підвищити продуктивність. Але пам’ятайте: більший розмір файлу журналу означає довше відновлення після аварійного завершення. Іноді за години !!!
    • innodb_flush_log_at_trx_commit = 0 або 2 - Якщо ви не переймаєтесь ACID і можете втратити транзакції протягом останньої секунди чи двох.
    • key_buffer_size - дуже важливий для MyISAM, але він використовується для дискових тимчасових таблиць.
    • Слідкуйте за станом INNODB
  3. Проаналізуйте ваше навантаження - знайдіть усі ваші запити до журналу сповіщень і запустіть на ньому mk-query-digest. Ви можете спіймати всі запити, використовуючи tcpdump та maatkit
    • Які запити займають більшу частину вашого сервера?
    • Чи створюються якісь тимчасові таблиці, особливо великі тимчасові таблиці?
    • Дізнайтеся, як використовувати пояснення
    • Чи використовує ваша програма транзакції? Коли ви запускаєте запити з autocommit = 1 (за замовчуванням для MySQL), кожен запит на вставлення / оновлення починає нову транзакцію, яка виконує деяку накладну оплату. Якщо це можливо, краще відключити автокомісію (у драйвері python MySQL автокомісія відключена за замовчуванням) та виконувати фіксацію вручну після всіх модифікацій.
    • Чи ваша програма робить цикл вставок до однієї таблиці в циклі? Load data infileкоманда набагато швидша для серії вставок.
    • Пам'ятайте: select count(*) from table;це набагато повільніше для innodb, ніж для myisam.
    • Які типи запитів INSERT / UPDATE займають більшу частину серверного часу? Як їх можна оптимізувати?
    • Перевірте, чи є у вашої БД належні індекси, і додайте їх, якщо потрібно.

У нашому середовищі була ситуація, що один тип запитів на оновлення проходив повільно. Приблизний час закінчення партійної роботи склав 2 дні !!! Проаналізувавши журнал зворотного запиту, ми виявимо, що для цього типу запиту на оновлення потрібно 4 секунди. Запит виглядає наступним чином : update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz. Після перетворення запиту оновлення для вибору запиту та запуску пояснення цього запиту вибору, який ми знаходимо, що цей тип запиту не використовує індекс. Після створення належного індексу ми скоротили час виконання запиту на оновлення до мілісекунд, і вся робота була закінчена менш ніж за дві години.

Деякі корисні посилання:


Перед тим, як перевірити показники. Деградація SMELLs на зразок "як таблиці збільшуються, тому що ми не маємо індексів".
TomTom

5

З конфігурацією nevinoBB за замовчуванням ви обмежуєтесь швидкістю запису та передачі транзакцій на диск. Якщо ви можете впоратися із втратою трохи кислоти, експериментуйте з innodb_flush_log_at_trx_commit. Встановіть 0 для запису та передачі журналу на диск приблизно кожну секунду. Встановіть значення 1 (за замовчуванням), щоб писати та обмінювати всі комісії. Встановіть 2, щоб записати у файл журналу після кожної фіксації, але оберіть лише раз на секунду.

Якщо ви можете впоратися з втратою 1 секунди транзакцій, це може бути чудовим способом значно покращити продуктивність запису.

Також зверніть увагу на те, що роблять ваші диски. RAID 10> RAID 5 для запису вартістю додаткового диска.


1

Проблеми з блокуванням будуть прикладом статусів з'єднання в show full processlist;

Прочитайте my.cnfдокументацію та MySQL. Параметри конфігурації дуже добре зафіксовані.

Взагалі кажучи, ви хочете якомога більше обробитись в пам'яті. Для оптимізації запитів це означає уникати тимчасових таблиць. Правильне застосування індексів.

Налаштування буде специфічним для вашого бажаного двигуна бази даних та архітектури додатків. В Інтернеті немає значних ресурсів.



0

InnoDB - досить хороший двигун. Однак він дуже покладається на "налаштування". Одне полягає в тому, що якщо ваші вставки не в порядку збільшення первинних ключів, inaDB може зайняти трохи більше часу, ніж MyISAM. Це можна легко подолати, встановивши більший розмір innodb_buffer_pool_size. Моя пропозиція - встановити його на 60-70% від загальної оперативної пам’яті. Зараз я працюю на виробництві 4 таких серверів, вставляючи близько 3,5 мільйонів рядків на хвилину. Вони вже мають близько 3 терабайт. У InnoDB це мало бути через дуже одночасні вставки. Є й інші способи пришвидшити вставки. І я дещо орієнтував.


0

Як я вирішую проблеми з вставкою та оновленням продуктивності в MySQL у веб-додатку, просто відключивши автоматичну фіксацію та вчинити зміни один раз у Java. Як запропоновано в документації на mysql.

Документи MySQL

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