Возможно ли увеличить скорость работы агрегатных функций?
Приветствую.
Задался вопросом, а поможет ли докупка мощностей и последующая настройка конфигов сервера MySQL (под Ubuntu) в производительности запросов, т.е. уменьшения времени выполнения агрегатных функций?
И вообще, какие существуют способы ускорения запросов аля COUNT/SUM/AVG на движке InnoDB, когда количество записей начинает исчисляться миллионами (сейчас COUNT 1.5 млн строк занимает ~0.6 сек)?
На сферический COUNT в вакууме поможет железо и тонкая настройка, но с количеством данных все равно будет замедляться.
Для обычных ситуаций когда в запросе есть условия уже могут быть индексы, партиции и т.д. Что чуть более чем полностью решает вопрос, по крайней мере пока размер данных не переваливает за неведомую планку big data.
1. А что именно нужно менять в "тонкой настройке"? Просто увеличив innodb_buffer_pool_size до 60% памяти ничего не дало. Разницы между 4 ядра / 8 ГБ и 8 ядер / 16 ГБ не увидел.
2. А если речь идёт о агрегатных функциях с JOIN'ами? Какова практика работы с такими запросами?
Александр,
1. mysqltuner и тюнить до бесконечности, до момента когда результат уже незаметен на глаз) Увеличивать конфиги так чтобы чуть ли не вся таблица/база лежала в раме, это максимизирует скорость. Ядра сами по себе не знаю точно помогут или нет, но Mhz одного ядра тоже должны увеличить скорость работы. Так что просто смена 4 на 8 ядер не факт что поможет если процессор тот же или около того. Ну и SSD само собой должен быть на сервере.
2. Со всеми запросами одна практика - explain. Там будет понятно что именно делается и что нужно подправить. Джоины сами по себе не оптимизируются, решается всё обычно индексами в таблице куда джоин ходит т.к. он точно так же делает обычный запрос с условиями и без индекса он будет перебирать все данные.
Ну собственно explain должен это показать в том числе. Самый главный критерий это столбец rows в explain. Чем меньше тем лучше. Если там число приближающееся к количеству все записей в таблице значит всё очень плохо либо запрос без условий.