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
Форумы портала PHP.SU :: Версия для печати :: индекс таблицы
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » индекс таблицы

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

1. KoDeRSmerT - 06 Августа, 2014 - 09:55:57 - перейти к сообщению
привет.
вот такой простой запрос из топ рейтинга.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `id` FROM top WHERE site_id='$sid' AND ip='$ip' AND browser='$browser'


чего можно поправить здесь для максимальной скорости? больше 1000 раз в секунду выполняется этот запрос.


можно например проверить так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `id` FROM top WHERE site_id='$sid' AND md5_ip_brow='$md5_ip_brow'
  2.  


но думаю будут у вас лучшие варианты чем этот )
2. Мелкий - 06 Августа, 2014 - 11:26:13 - перейти к сообщению
Повесить индекс. Везде строгие равенства, потому порядок полей в индексе для этого запроса значения не имеет.

Если в итоге индекс получился слишком объёмный (я так понимаю, $ip по недоразумению, $browser по определению - строки) - то действительно уместен хеш-индекс. mysql их напрямую не умеет, так что делается ещё одно поле, индексируется (ни в коем случае не уникальным ключом!) и туда пишется хеш от нужных данных. md5 тяжеловесен для хранения, банальный числовой crc32 наверняка даст достаточную селективность.
3. KoDeRSmerT - 06 Августа, 2014 - 16:44:18 - перейти к сообщению
Мелкий пишет:
Повесить индекс. Везде строгие равенства, потому порядок полей в индексе для этого запроса значения не имеет.

Если в итоге индекс получился слишком объёмный (я так понимаю, $ip по недоразумению, $browser по определению - строки) - то действительно уместен хеш-индекс. mysql их напрямую не умеет, так что делается ещё одно поле, индексируется (ни в коем случае не уникальным ключом!) и туда пишется хеш от нужных данных. md5 тяжеловесен для хранения, банальный числовой crc32 наверняка даст достаточную селективность.


окей спс за подробное описание. + ещё один код есть. в этом точно есть что поправить. потому что что-то очень медленно работает `in`. если можно поправьте пожалуйста код на самый оптимальный.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT SQL_CALC_FOUND_ROWS site FROM hosts WHERE site_id IN (SELECT `id` FROM users WHERE  cat='4' AND STATUS=0 ) GROUP BY site ORDER BY count(id) DESC,sum(hit) DESC;
  3.  
4. Мелкий - 06 Августа, 2014 - 22:18:47 - перейти к сообщению
Лучше обновитесь до mysql 5.6, он уже должен нормально такие запросы жевать.

Можно попробовать на джойн переписать. На будущее - вопросы о производительности конкретных запросов без соответствующего explain'а задавать неправильно.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT SQL_CALC_FOUND_ROWS site FROM hosts
  2. JOIN (SELECT `id` AS `site_id` FROM users WHERE  cat='4' AND STATUS=0) selectedsites USING(site_id)
  3.  GROUP BY site ORDER BY count(id) DESC,sum(hit) DESC;

Ну и SQL_CALC_FOUND_ROWS без limit'а выглядит странно.
5. KoDeRSmerT - 07 Августа, 2014 - 09:06:37 - перейти к сообщению
Мелкий пишет:
Лучше обновитесь до mysql 5.6, он уже должен нормально такие запросы жевать.

Можно попробовать на джойн переписать. На будущее - вопросы о производительности конкретных запросов без соответствующего explain'а задавать неправильно.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT SQL_CALC_FOUND_ROWS site FROM hosts
  2. JOIN (SELECT `id` AS `site_id` FROM users WHERE  cat='4' AND STATUS=0) selectedsites USING(site_id)
  3.  GROUP BY site ORDER BY count(id) DESC,sum(hit) DESC;

Ну и SQL_CALC_FOUND_ROWS без limit'а выглядит странно.


спс ) лимит есть. просто я не написал в примере.

 

Powered by ExBB FM 1.0 RC1