SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.09.2007 14:38:28

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

HAVING тормозит

Есть база innobb 1Гб и запрос с
       HAVING  f_EA.`NO` =  '100070'
на mSsql выплняется за 1 сек
на mYsql выплняется за 20 сек!

Если HAVING Count(f_EА.KEY)=0
на mSsql выплняется за 15 сек
на mYsql выплняется за 30 сек!
Почему HAVING  так медленно работает, может увеличить какой-нить параметр или это специфика мускула?

Неактивен

 

#2 06.09.2007 15:15:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: HAVING тормозит

Перепишите запрос так, чтобы было WHERE f_EA.`NO`=100070. HAVING
не использует индексы, что негативно влияет на производительность.

Для общей оптимизации, можете попробовать поставить innodb_buffer_pool_size=1G,
запросы будут выполняться быстрее.

P.S. Специфики тут нет, HAVING не должен работать по индексу, но допускаю,
что Microsoft могли что-то оптимизировать (например, автоматически преобразовывать
HAVING в WHERE в тривиальных случаях).

Неактивен

 

#3 06.09.2007 15:15:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: HAVING тормозит

HAVING обычно требует сохранение результатов GROUP BY во временную таблицу и, затем, выборку из нее. Сделайте EXPLAIN запросу, скорее всего будет "using temporary".

Способы улучшить:
1. увеличить tmp_table_size - максимальный размер временной таблицы в памяти
2. постараться ужесточить условие WHERE, то есть все, что можно перенести в WHERE
3. уменьшить число выбираемых полей

например
SELECT u.id, u.name, u.description, sum(r.rating) total FROM users u LEFT JOIN ratings r ON r.user=u.rating GROUP BY u.id HAVING total>1000;
можно переписать как
SELECT id,name,description FROM users WHERE id  IN (SELECT u.id, sum(r.rating) total FROM users u LEFT JOIN ratings r ON r.user=u.rating GROUP BY u.id HAVING total>1000);
тогда сортировка будет быстрее, так как сортировать только таблицу id-шников, а если это ключевое поле, то MySQL обойдется чтением ключа

Неактивен

 

#4 06.09.2007 15:33:32

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

Re: HAVING тормозит

Спасибо за тветы. Насчет where понятно, при explain действительно используется temparary, попробуем pool_size и упрощение запросов. Просто переписываем программу с access на delphi и mysql (немного не обычно) и делаем на время чтобы access работал с mysql (совсем не бычно), (т.к. зачастили люди в масках и спрашивают лицензию), и при переписании на mysql запросы которые выполнялись в access быстро на мускуле тормозят, в частности having, вот и подумали, а не упремся ли мы в стену большого тормоза и все старания на смарку.

Неактивен

 

#5 06.09.2007 15:43:35

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: HAVING тормозит

В целом MySQL более быстрая база, чем Access. Я думаю, что если Вы поправите запросы и добавите необходимые ключи, то работать будет быстрее, чем раньше.

Неактивен

 

#6 06.09.2007 16:23:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: HAVING тормозит

Думаю, ключевая проблема в комбинации Access+MySQL. Мой прошлый опыт
(правда, там было Access+MSSQL) говорит, что Access вытягивает все данные
из всех подсоединенных таблиц вне зависимости от того, нужны они ему или нет.
Более того, на каждом запросе он склонен перечитывать эти данные на случай,
если они изменились.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson