MySQL tmp_table_size

4 отговора 1245 прегледа
#1

MySQL tmp_table_size

Здравейте,

Опитвам се да оптимизирам mysql така че възможно по-малко temporary таблици да се създават на диска, като вместо това се ползва рам-а.

В my.cnf увеличих от 32М на 50М това:
tmp_table_size = 50М

после го промених на 130М но никакъв ефект нямаше. като пусна mysqladmin variables си излиза че tmp_table_size е наистина 130М, обаче след 2 часа работа на сървъра:

Created_tmp_disk_tables | 352
Created_tmp_tables | 871

т.е половината се записват на диска... Странното е че най-голямата база данни цялата е 40 МБ и не ми е ясно каква тази темп таблица дето да не се побере в 130 МБ.

Единственото което намерих като възможно обяснение е, че когато в темп таблицата която се създава има поле от тип blob, тя се създава само на диска. дали това е причината?

Отговор
в отговор на mysqld #2

Re: MySQL tmp_table_size

Обяснението за размера на временните таблици е, че ти винего си създават с CHAR колонки вместо VARCHAR и оттам могат да се окажат доста по-големи от очакваното.

Вместо да увеличаваш tmp_table_size можеш да я намалиш и да сложиш tmpdir на файлова система в RAM. Примерно tmpfs

salle.online.bg/sig
Отговор
в отговор на salle #3

Re: MySQL tmp_table_size

Ясно, мерси :)

Това да сложа tmpdir в рама не носи ли опасност да се изхаби целия рам в някой по-натоварен момент. Примерно при някой голям dump. Кото се има предвид че и всичко ще отива там - всички темп таблици, независимо колко са големи, големите сортове и джойнове... Ако правилно разбирам tmpfs ще залъгва mysql че си пише по диска а то ще е в рама. и така значи всички операции на mysql да се качат в рама?

Предполагам че това би бил оптималния вариянт за performance, обаче рама е само 1ГБ, а сървъра не е дедикейтед само за mysql а също върви апаче, ексим и т.н.

Отговор
в отговор на mysqld #4

Re: Ами нали знаеш ..

Той отговорът винаги е един:
- Зависи!

Помисли за следното.
Паметта в момента е много евтина. От друга страна на 32-битов процесор всеки процес е ограничен до 2-3 GB (зависи от конкретната ОС, ядро, библиотеки)

Та това с tmpfs е начин да заобиколиш донякъде въпросното ограничение.

Не забравяй, че tmp_table_size е валидно за всяка сесия. Ако имаш 20 едновременни заявки които се опитват да захапят по 120MB RAM всяка определено имаш проблем.

salle.online.bg/sig
Отговор
в отговор на salle #5

Благодаря! :)

Мерси много за информацията. Ще видя какво може да се направи по хардуера, но както бях чел някъде за mysql:

с оптимизиране на сървъра може да се увеличи производителността до 10 пъти, но с оптимизиране на заявките и структурата на базата данни, може да се подобри и 1000 пъти :) Но все пак исках да знам че от my.cnf съм изстискал каквото може де.

Отговор