Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: оптимизация

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
phpself
Отправлено: 22 Сентября, 2011 - 16:30:55
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




Добрый всем день Улыбка

есть такой запрос

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT COUNT(IF(apremium > 0, 1, NULL)) AS premium_ads,
  3.             COUNT(*) - COUNT(IF(apremium > 0, 1, NULL)) AS ads_in_rub_with_premium,
  4.             COUNT(*) AS ads_in_rub,
  5.             (SELECT COUNT(*) AS number_ads FROM 1ads WHERE astatus > 0) AS ads_in_region
  6. FROM 1ads WHERE astatus > 0 AND adrub = 101
  7.  


как его можно оптимизировать ?
 
 Top
caballero
Отправлено: 22 Сентября, 2011 - 16:42:09
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




проследи чтобы в таблицах было индексы
и count лучше ставить индексное поле всесто *

adrub на это поле индекс поставь


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
phpself
Отправлено: 22 Сентября, 2011 - 16:49:31
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




caballero пишет:
проследи чтобы в таблицах было индексы
и count лучше ставить индексное поле всесто *

adrub на это поле индекс поставь


Спасибо, индексы уже где нужно проставлены. Заменил * на индексируемое поле как вы посоветовали. Сразу же протестировал, стало быстрей.

Я в этом запросе использую вложенный запрос. который из этой же таблицы делает выборку по другому параметру. Возможно в этом куске запроса можно что-то изменить ?
 
 Top
caballero
Отправлено: 22 Сентября, 2011 - 16:59:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




count по индексу читает быстро - хjтя это тупой оптиvизатор в mysql он должен был сам сообразить взять primary key

astatus здесь индекс попробуй поставить


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
phpself
Отправлено: 22 Сентября, 2011 - 17:11:44
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




caballero пишет:
count по индексу читает быстро - хjтя это тупой оптиvизатор в mysql он должен был сам сообразить взять primary key

astatus здесь индекс попробуй поставить


Спасибо за ответы Улыбка) В принципе производительность хорошая, просто думал что можно еще лучше сделать! Улыбка
 
 Top
MrBeard
Отправлено: 24 Сентября, 2011 - 21:25:38
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011  


Помог: 2 раз(а)




caballero пишет:
проследи чтобы в таблицах было индексы
и count лучше ставить индексное поле всесто *

adrub на это поле индекс поставь

а разве ему нужен не индекс по двум полям? Мы же говорим про MySQL, не правда ли?
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE astatus > 0 AND adrub = 101

INDEX my_table_index ( astatus, adrub);

и вообще, при просьбе оптимизации было бы интересно глянуть на explain, наверно. Плюс есть профайлинг для таких целей
 
 Top
Champion Супермодератор
Отправлено: 24 Сентября, 2011 - 21:40:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




MrBeard пишет:
WHERE astatus > 0 AND adrub = 101
INDEX my_table_index ( astatus, adrub);

тогда уж (adrub, astatus)
А explain и ddl таблиц не помешал бы.

Лучше всего иметь индексы по astatus, adrub и apremium (скорее всего отдельные)
И вытягивать все count(*) отдельными запросами. count(*) при наличии индексов сработает быстрее, чем count(выражение).

Плюс select count(*) from tbl where f > 0
иногда бывает полезно заменить на (select count(*) from tbl) - (select count(*) from tbl where f = 0 ), если f в таблице не имеет отрицательных значений, а нулей мало.

В любом случае нужно на конкретной вашей базе попробовать все варианты и выбрать наилучший.
 
 Top
MrBeard
Отправлено: 24 Сентября, 2011 - 21:45:38
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011  


Помог: 2 раз(а)




Champion пишет:

тогда уж (adrub, astatus)

эм, с чего бы это? у него
1) последовательность запроса именно astatus, abrub;
2) подзапрос имеет WHERE astatus > 0;
как при этом получается индекс (adrub, astatus) ?
почитаю ка про оптимизатор мускулевый)

в принципе, могу предположить, что последовательность условий в where может поменять оптимизатор самой базы данных(надо бы проверить завтра), но тогда получится, что нужен отдельный индекс для astatus.

(Отредактировано автором: 24 Сентября, 2011 - 21:50:43)

 
 Top
caballero
Отправлено: 24 Сентября, 2011 - 22:08:13
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




можно посмотреть план запроса
и вобщем то даже задать его
но то что нужен отдельный индекс по полю astatus вместо индекса по двум полям - это очевидно и так


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 24 Сентября, 2011 - 22:15:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MrBeard пишет:
эм, с чего бы это?

Потому что adrub - константа. Так как ключ упорядочен по значениям, запрос отсечёт моментально всё, не равное константе и останется только смотреть малый объём второй части ключа.
Иначе - придётся сначала искать все astatus>0 и в каждом искать adrub = константа.

MrBeard пишет:
в принципе, могу предположить, что последовательность условий в where может поменять оптимизатор самой базы данных

Смотрит и меняет всегда. Ещё на этапе разбора синтаксиса - хотя бы удостовериться, что запрос вообще имеет смысл, как то limit 0, where `a`=1 and `a`=2 и более хитрые варианты.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB