2016-05-04 2 views
1

У меня есть следующий запрос:Медленный запрос MySQL - как улучшить производительность

SELECT `authors`.email, COUNT(articles.id), SUM(stats.count_stats) 
FROM articles 
INNER JOIN authors ON articles.id = `authors`.article_id 
LEFT JOIN (
    SELECT article_id, SUM(count_cited) AS count_stats 
    FROM article_citations_stats 
    GROUP BY article_id) AS stats ON articles.id = stats.article_id 
GROUP BY `authors`.email 
HAVING SUM(stats.count_stats) > 10 

Таблицы:

authors has 200 000 rows 
articles has 60 000 riws 
article_citations_stats has 200 000 rows 

Запрос крайне медленно. Любая идея о том, как улучшить производительность.

+0

обеспечивает вашу схему ('SHOW CREATE TABLE') для каждой таблицы, пожалуйста, – Alex

+0

вопросов эффективности должны включать' EXPLAIN ANALYZE' и некоторую информацию о размере таблицы, индексе текущей производительности времени, время желания и т.д. 'Slow' является относительным термином, и нам нужно реальное значение для сравнения. [** MySQL **] (http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

+0

Привет, Алекс, сделано ... –

ответ

1

Просто технический вопрос (извините, что должно быть в комментариях, но так как это мой первый пост я не достаточно очков, пока): являются авторов позволили иметь больше статей и статей в Есть еще авторов?

Из текущего определения можно увидеть ПК в авторов таблицы на идентификатор и article_id не является нулевым. Так что, если:

  1. идентификатора является идентификатором из автора то каждый автора имеет ровно одну статьи (возможно, совместно с другим автором), и я думаю, что вы не» t необходимо присоединиться к статьям стол, вы можете просто посчитать articles_id напрямую от авторов ta BLE. Вы также можете напрямую использовать его для соединения с таблицей .

  2. идентификатор только идентификатор строки то на самом деле автор может иметь более статьи чем 1, но тогда авторы таблица может быть огромным, и это, вероятно, лучше, чтобы перестроить его, чтобы иметь AUTHOR_ID в статей таблица. В этом подходе, однако, вы не можете больше авторов для одного статья.

  3. Допустимо, что у многих авторов есть больше статей и наоборот, здесь потребуется таблица мостов. А затем группу, используя эту таблицу. Поскольку 1. не позволяет иметь больше статей и 2. не позволяет иметь больше авторов, я бы пошел на 3.

2

Попробуйте добавить следующие индексы таблиц (если они не там еще)

articles - (id) 
authors - (id,email) 
article_citations_stats - (article_id,count_cited) 

Это должно ускорить ваш запрос.

Кроме того, вы можете объяснить, что вы пытаетесь сделать, и мы поможем вам найти более быстрый запрос, если это возможно.

+0

Спасибо Sagi, я пытаюсь получить всех авторов (email) для тех, у кого более 10 ссылок на все опубликованные статьи. Также количество статей. –

+0

Я добавил все индексы (некоторые из них уже есть), но он все еще медленный. Я уже жду 150 секунд и все еще обрабатываю. –

+0

Добавлена ​​также таблица с таблицей –

Смежные вопросы