2013-09-10 4 views
0

У меня есть приложение, которое анализирует людей facebook и сравнивает их с вещами, которые им, возможно, понравились в прошлые десятилетия.MySQL Query slow

В качестве части уточнения совпадений у нас есть, я хочу, чтобы каждый пользователь любил (с хешем их идентификатора facebook, чтобы он был анонимным). Люди могут вводить несколько раз, поэтому он хранит их несколько раз, что немного искажает результаты.

Так что мой user_likes таблица выглядит так:

id | page_id | user_id_hash 
---------------------------------- 
    |   | 

У меня есть около 820000 записей в настоящее время.

В настоящее время, если я делаю запрос:

SELECT page_id, COUNT(*) from user_likes 
GROUP BY page_id LIMIT 0,30 

Это занимает около 8 секунд и дает мне неправильный подсчет, так как он может считать людей, которые въехали несколько раз больше, чем один раз.

Мои вопросы:

1) Как я могу ускорить этот запрос вверх?
2) Как я могу получить более точный счет?

+1

попробуйте выполнить следующее: 'ALTER TABLE user_likes ADD INDEX page_id (page_id)' - это будет индексировать столбец page_id. –

+0

Я предполагаю, что ускоряет запрос правильно? Я попытался сделать это и получил ошибку mysql: 'для правильного синтаксиса для использования рядом с 'KEY (page_id)' в строке 1' – ahren

+1

Неплохо, попробуйте еще раз. Я перепутал синтаксис. 'ALTER TABLE user_likes ADD INDEX page_id (page_id)' –

ответ

2

Вы можете получить более точное количество по формулируя запрос следующим образом:

SELECT page_id, COUNT(distinct user_id_hash) 
from user_likes ul 
GROUP BY page_id LIMIT 0,30; 

ускоряя его в MySQL сложно, из-за group by. Вы можете попробовать следующее. Создайте индекс на user_likes(page_id, user_id_hash). Тогда попробуйте это:

select p.page_id, 
     (select count(distinct user_id_hash) 
     from user_likes ul 
     where ul.page_id = p.page_id 
     ) 
from (select distinct page_id 
     from user_likes ul 
    ) p 

Идея этого запроса, чтобы избежать group by - плохо реализован оператор в MySQL. Внутренний запрос должен использовать индекс, чтобы получить список уникальных page_id. Подзапрос в select должен использовать тот же индекс для count. При работе с индексами счет должен идти быстрее.

+0

Огромное спасибо. И я предполагаю, что могу добавить счетчик ORDER BY (отдельный user_id_hash) DESC'? – ahren

+0

Кроме того, мне было интересно, на каком этапе я столкнулся с проблемой с количеством записей? Это всего лишь 1 день, и у меня есть 820 000 записей ... Это предназначено для работы в течение двух месяцев. – ahren

+0

@ahren. , , Я не знаю. Если вы имеете дело с данными из Facebook, убедитесь, что у вас есть оборудование для его поддержки. –