Долго выполняется запрос

Altex

Новичок
Долго выполняется запрос

Есть сайт со статистикой посещаемости других сайтов. Каждый хит записывается в БД одной записью - id, platform, browser, scr_size, color_depth, site_id etc...

ну тк вот, когда записей там всего 30 000, то вот такой запрос, смысл которого - узнать самый популярный браузер за всё время , а именно :
[sql]
select count(distinct ip,platform,scr_size,color_depth,browser)
from example_counter
where site_id=[num]
group by browser
order by 1 desc
limit 1
[/sql]
выполняется порядка 3,8 секунд. Что пугает, потомучто если записей будет на порядок или 2 больше то что же будет тогда?...

Как можно увеличить скорость вот подобных запросов в БД? Что вы думаете по этому поводу?
 

Falc

Новичок
Altex
Я считаю что прежде чем писать подобные системы тебе надо почитать про основы реляционных баз данных.
Ну а каунт ты крутой расчитываешь.
 

Altex

Новичок
Спасибо, Тони, но индексирование не помогло, потомучто у меня практически все site_id пока одинаковые. Возможно потом это разница будет заметна.

А почему ты считаешь запрос странным? Как бы ты сделал на моем месте?
 

tony2001

TeaM PHPClub
[sql]
SELECT count(*) as counter
FROM example_counter
WHERE site_id = [num]
GROUP BY browser
ORDER BY 1 DESC
LIMIT 1
[/sql]
неясно к какому боку там distinct.
 

Falc

Новичок
Тони дистинкт там нужен, иначе он будет считать не поситителей а посещения, у него структура не нормализированая, и он хочет что бы у него все быстро работало.
Я не удивлюсь если у него platform и browser - это текстовые поля.
 

Falc

Новичок
По проводу ускорения даного запроса построй составной индекс site_id, browser должно помочь. Но это все равно тебя не спасет когда кол-во записей у тебя перепрыгнет за милион.
 

Altex

Новичок
Falc, совершенно верно, дистинкт для этого и нужен.

А вот насчет текстовых полей конечно ты прав, потомучто не прав я когда решил что так будет лучше.

Спасибо, попробую эти поня заменить.
 

Falc

Новичок
Тебе надо пользователей в отдельную табличку выносить, еще полезно ввести такое понятие как сессия пользователя на сайте. тогда все встанет на свои места.
 

Altex

Новичок
Ещё не понятно почему с индексом, который предложил Тони стал в 1,5-2 раза медленнее выполнятся запрос
 

Falc

Новичок
иногда так бывает, что поиск через индекс работает медленее чем перебор всех записей. Когда сайтов станет больше будет работать быстрее.
 

tony2001

TeaM PHPClub
>иногда так бывает, что поиск через индекс работает медленее чем перебор всех записей.
можно пример ситуации привести?
 

Falc

Новичок
>> Можно поподродбее, пожалуйста?

Делаем табличку пользователей. Водим распознование пользователей, например по кукам или по IP, можно комбинировать.
Когда новый пользователь приходит на сайт добавляем его в эту таблицу.

Еще делаем таблицу сесий, когда пользователь заходит для него заводится сесия, и которая ссылаеться на пользователя и на посещаемый им сайт.
Сами же хиты ссылаются на сессии и страницы.
 

tony2001

TeaM PHPClub
>Пример чуть выше.
пример чуть выше пока не показывает ничего.
есть некая кривая таблица, в которой (по утверждению автора топика) индекс замедляет запросы.
но раз уж ты сослался на этот "пример", то мне бы хотелось услышать твои предположения о том, почему это может происходить.
и заодно, плз, твое понимание индекса.

ссылки в стиле - "сам не видишь?" приводить не надо, плз.
 

Falc

Новичок
Я приведу цытату из мана:

В некоторых случаях MySQL не использует индекс, даже если это возможно. Несколько примеров таких ситуаций приведено ниже:

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

Надеюсь это тебя устроит?
 

tony2001

TeaM PHPClub
Falc
я повторю вопрос более тщательно:
не мог бы ты привести пример ситуаций, в которых индекс, созданный в таблице MyISAM, будет замедлять выборки?
для тех, кто не понял: _замедлять выборку_. не "не использоваться", не "не ускорять", а _замедлять выборку_.
(то, что вставка в таблицу при этом незначительно замедляется, я знаю, спасибо, не надо цЫтат)
 

Falc

Новичок
Тони про вставки речи вообще не было, еще раз посмотри на веделеный фрагмент:
Если использование индекса требует от MySQL прохода более чем по 30% строк в данной таблице (в таких случаях просмотр таблицы, по всей видимости, окажется намного быстрее, так как потребуется выполнить меньше операций поиска).
 

tony2001

TeaM PHPClub
проблема, видимо, в том, что ты даже свои цитаты не читаешь:
В некоторых случаях MySQL не использует индекс, даже если это возможно.
этот пример из мана демонстрирует ситуацию, когда MySQL не использует индекс.
соотв-но, если проблема автора соответствует примеру из мана, то индекс у него использоваться не будет.
и замедлять, соотв-но, ничего не будет.
так?
 
Сверху