MySQL присоединяется к изучению каждой строки - PullRequest
3 голосов
/ 23 октября 2011

Выполнение этого запроса на моем сайте занимает очень много времени.У меня есть блог и форум на моем сайте, которые я свободно интегрировал, поэтому каждая учетная запись на форуме имеет учетную запись в блоге и наоборот.Однако идентификаторы user_id в каждой таблице не коррелируют, поэтому я присоединяю их по имени пользователя.

SELECT *
FROM comments AS c
INNER JOIN articles AS a ON c.article_id = a.article_id
INNER JOIN user_profiles AS p ON c.user_id = p.user_id
INNER JOIN blog_users AS b ON c.user_id = b.user_id
INNER JOIN forum_users AS f ON b.username = f.username
WHERE a.article_id =  :article_id
ORDER BY c.comment_id DESC 
LIMIT 0 , 30

Когда я использовал объяснение в запросе, я увидел, что последнее объединение проверяет каждую строку в таблице forum_usersчтобы получить результат, который составляет более 1 000 000 строк.Столбцы имени пользователя для обеих таблиц индексируются, и все таблицы InnoDB.В качестве обходного пути я сохраняю user_id форума каждого пользователя в таблице blog_users, и наоборот, поэтому я могу присоединиться непосредственно к user_id, у которого запрос выполняется намного быстрее, но я бы хотел избежать этого, если это возможно.Есть ли способ, которым я мог бы переработать запрос, чтобы объединить имя пользователя было более эффективным?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Одинаковые ли наборы символов таблицы и столбца? Например, blog_users в utf8 и forum_users в latin1? Если они не совпадают, mysql не будет использовать индексы. Вы можете изменить набор символов, например:

ALTER TABLE blog_users CONVERT TO CHARACTER SET utf8

Если это проблема, внимательно прочитайте документы, прежде чем делать это. Это может изменить содержание столбцов. http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

0 голосов
/ 23 октября 2011

Две вещи ... Имеет ли ваша таблица комментариев индекс для идентификатора статьи ... если нет, получите один ... Во-вторых, ваше предложение where ссылается на таблицу JOINED запроса, а не на первичную таблицу вваш SELECT FROM ... Так как у них обоих есть столбцы для идентификатора статьи, я бы изменил ваше предложение where на

WHERE c.Article_ID = :article_ID

Кроме того, обеспечил бы индексы

user_profiles index для User_ID

индекс blog_users для идентификатора пользователя

индекс forum_users для имени пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...