Чому MySQL створює стільки тимчасових таблиць на диску?


13

Чи може будь-яка помилка конфігурації призвести до створення занадто багато темп-таблиць за допомогою показу тюнера mysql..mysql

Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk

table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%

Раніше темп-таблиця була "з 23725 темп-таблиць 38% створено на диску", але я змінив max_heap і tmp_table на 200 м з 16 м, і він знизився до 30%.

Конфігурація:

engine myisam 
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800

Інша система з конфігурацією за замовчуванням показує "з 23725 тимчасових таблиць, 1% створено на диску" з тією ж базою даних.

Я спробував змінити цю версію на машині за замовчуванням, і вона все ще показує "З 580 тимчасових таблиць 16% створено на диску".

Я використовую 64-розрядний Ubuntu 11.4 з 48 ГБ оперативної пам’яті. Чи може хтось запропонувати рішення?

Чи змінить двигун db з "myisam" на "memory" на таблицях за допомогою "group by" це виправить? Як пояснено тут: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-cause-by-on-disk-temporary-tables/

Відповіді:


16

mysqltuner рідко надає будь-яку корисну інформацію. Він використовує здебільшого нерелевантні статистичні дані про "кількість показів" та встановлює довільні обмеження щодо того, яка кількість віджетів є прийнятною. Якщо ви не стикаєтеся з проблемою продуктивності, то вам насправді не потрібно вирішувати жодну з проблем, які вона представляє вам. Однак, ось трохи довідкової інформації про тимчасові таблиці ...

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

Тимчасові таблиці створюються на диску, коли:

  • Присутні поля TEXT або BLOB (оскільки MEMORY не підтримує ці типи)
  • розмір отриманої неявної тимчасової таблиці перевищує меншу tmp_table_sizeабоmax_heap_table_size
  • Якщо стовпець w / більше 512 байт використовується або з групою BY, або в союз, або з замовленням BY

Детальніше прочитайте Документацію MySQL на внутрішніх тимчасових таблицях.

Що ви можете з цим зробити? Припускаючи, що це насправді представляє проблему з продуктивністю (а не просто турбує вас інтелектуально):

  • Уникайте полів TEXT / BLOB і натомість використовуйте поля VARCHAR або CHAR відповідного розміру, де це можливо.
  • Якщо TEXT / BLOB неминучі, розкладіть їх на окремі таблиці зі зв’язком із зовнішнім ключем та ПРИЄДНАЙТЕ лише тоді, коли вони вам потрібні.
  • Обробляйте великі стовпці, більше 512 байт, як і вищезгадані поля TEXT / BLOB.
  • Переконайтеся, що ваші запити повертають лише необхідний набір результатів (належним чином вибірковий пункт WHERE, уникайте SELECT *)
  • Уникайте підзапитів і замінюйте їх на приєднання, особливо якщо вони повертають великий набір результатів
  • Остання можливість - підняти і те, tmp_table_sizeі max_heap_table_size. Не робіть цього, якщо ви не виявите, що ваші запити неможливо оптимізувати.

Якщо ви стурбовані своєю конфігурацією MySQL і не задоволені доступними налаштуваннями самостійно, ви можете перевірити майстра конфігурації Percona як вихідну точку.

Чи змінить двигун db з "myisam" на "memory" на таблицях за допомогою "group by" це виправить? як пояснено тут

Ні, це не буде, і це зробить так, що ваші таблиці ніколи не зберігаються на диску. Не робіть цього.


+1, але додав, що це менше tmp_table_sizeабоmax_heap_table_size
Дерек Дауні

Найкращою рекомендацією mysqltuner було включити повільний журнал запитів. Це допоможе вам визначити повільні запити, якщо такі є.
fat_mike

2

"використання тимчасового" та "використання файлового" не кінець світу!

ВИБІР ... ГРУПУ по a, b ЗАМОВЛЕННЯ c, d - Потрібно 1 або 2 "темп-таблиць".

Просто бувають випадки, коли ваші запити будуть використовувати темп-таблиці. Тимчасові таблиці можуть уповільнити запит невеликим фактором. Але якщо запит все ще "досить швидкий", тоді не хвилюйтеся.

Якщо запит занадто повільний (із таблицями tmp або без), давайте обговоримо його. Будь ласка, надайте ПОКАЗУВАТИ СТВОРИТИ ТАБЛИЦЮ, ПОКАЖІТЬ СТАТУС ТАБЛИЦІ та ПОЯСНІТЬ.


1
Якщо індекс увімкнено (a, b, c, d), не буде жодної тимчасової таблиці.
Іван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.