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]   

> Без описания
KoDeRSmerT
Отправлено: 06 Августа, 2014 - 09:55:57
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


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




привет.
вот такой простой запрос из топ рейтинга.
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.  


но думаю будут у вас лучшие варианты чем этот )

(Отредактировано автором: 06 Августа, 2014 - 09:57:29)

 
 Top
Мелкий Супермодератор
Отправлено: 06 Августа, 2014 - 11:26:13
Post Id



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


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


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




Повесить индекс. Везде строгие равенства, потому порядок полей в индексе для этого запроса значения не имеет.

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


-----
PostgreSQL DBA
 
 Top
KoDeRSmerT
Отправлено: 06 Августа, 2014 - 16:44:18
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


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




Мелкий пишет:
Повесить индекс. Везде строгие равенства, потому порядок полей в индексе для этого запроса значения не имеет.

Если в итоге индекс получился слишком объёмный (я так понимаю, $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.  

(Отредактировано автором: 06 Августа, 2014 - 16:45:01)

 
 Top
Мелкий Супермодератор
Отправлено: 06 Августа, 2014 - 22:18:47
Post Id



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


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


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




Лучше обновитесь до 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'а выглядит странно.


-----
PostgreSQL DBA
 
 Top
KoDeRSmerT
Отправлено: 07 Августа, 2014 - 09:06:37
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


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




Мелкий пишет:
Лучше обновитесь до 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'а выглядит странно.


спс ) лимит есть. просто я не написал в примере.
 
 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