/ / Оптимальна конфігурація тимчасових таблиць MySQL (таблиці пам'яті)? - sql, mysql, performance, optimization, temp-tables

Оптимальна тимчасові таблиці MySQL (таблиці пам'яті) конфігурації? - sql, mysql, продуктивність, оптимізація, temp-таблиці

Перш за все, я новачок у оптимізації mysql. Справа в тому, що в моєму веб-додатку (близько 400 запитів в секунду), запит, який використовує a GROUP BY що я не можу уникнути, і це є причиною створення тимчасових таблиць. Моя конфігурація:

max_heap_table_size = 16M
tmp_table_size = 32M

Результат: відсоткова ставка до диска + - 12,5%

Тоді я змінив налаштування, відповідно до цей пост

max_heap_table_size = 128M
tmp_table_size = 128M

Результат: відсоткова ставка до диска + - 18%

Результатів не очікували, не зрозуміли чому.

Це неправильно tmp_table_size = max_heap_table_size? Не слід збільшувати розмір?

Запит

SELECT images, id
FROM classifieds_ads
WHERE  parent_category = "1" AND published="1" AND outdated="0"
GROUP BY aux_order
ORDER BY date_lastmodified DESC
LIMIT 0, 100;

EXPLAIN

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort |

Відповіді:

9 для відповіді № 1

"Використання тимчасового" у звіті EXPLAIN не говорить про те, що тимчасова таблиця була на диску. Вона лише повідомляє нам, що запит очікує створення тимчасової таблиці.

Темп-таблиця залишатиметься в пам'яті, якщо її розмір менше, ніж tmp_table_size і менше, ніж max_heap_table_size.

Max_heap_table_size - найбільша таблиця може бути в двигуні пам'яті MEMORY, незалежно від того, чи є ця таблиця тимчасовою таблицею або не тимчасовою.

Tmp_table_size - найбільша таблицяпам'яті, коли він створюється автоматично за допомогою запиту. Але це не може бути більшим, ніж max_heap_table_size. Таким чином, встановлення tmp_table_size більше ніж max_heap_table_size. Це звичайне налаштування цих двох змінних конфігурації на однакове значення.

Можна відстежувати, скільки темп-таблиць було створено і скільки на диску, як це:

mysql> show global status like "Created%";
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 20    |
| Created_tmp_files       | 6     |
| Created_tmp_tables      | 43    |
+-------------------------+-------+

Зверніть увагу, що в цьому прикладі було створено 43 тимчасових таблиці, але тільки 20 з них були на диску.

Коли ви збільшуєте межі tmp_table_size і max_heap_table_size, ви дозволяєте існувати більші тимчасові таблиці в пам'яті.

Ви можете запитати, наскільки велика вона вам потрібна? Вам не обов'язково потрібно зробити його достатньо великим для того, щоб кожна окрема тимчасова таблиця вмістилася в пам'ять. Можливо, ви хочете, щоб 95% ваших тимчасових таблиць вмістилося в пам'ять, і тільки решта таблиць, що залишилися, потрапляли на диск. дуже великий - набагато більше, ніж обсяг пам'яті, який ви хочете використовувати для цього.

Тому моя практика - консервативно збільшувати tmp_table_size і max_heap_table_size. Потім дивіться співвідношення зі створення_tmp_disk_tables до Created_tmp_tables, щоб побачити, чи я виконав свою мету зробити 95% з них залишилися в пам'яті (або будь-якого співвідношення я хочу бачити).

На жаль, MySQL не має хорошого шляхурозповісти вам, наскільки великими були тимчасові таблиці. Це змінюватиметься за запитом, тому змінні статусу не можуть показувати, що вони можуть показувати вам лише кількість випадків, коли це сталося. він буде відповідати.

Альтернативою є Percona Server, який є дистрибутивом MySQL з поліпшеннями. Один з них - це Запишіть додаткову інформацію в журнал повільних запитів. Додаткові поля включають розмір будь-яких тимчасових таблиць, створених даним запитом.