Mysql индексация ситуации с DISTINCT - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть 2 таблицы

Во-первых, где удерживаются темы

Во-вторых, где удерживаются сообщения.


Я хочу сделать мод Недавние темы длямой проект.Его цель - перечислить последние 30 тем ..

смысл в том, что я могу легко позвонить

"select * from topics order by date desc limit 30;"

, но я не хочу просто перечислять последние 30 тем, которые я хочу перечислить, обновляя последние 30 темпо сообщениям.

хорошо, позвольте мне рассказать вам пример, который у меня на уме!:

Допустим, есть 5 тем, и они недавние.

*Hello Whats UP?
*Good Morning
*Good Afternoon
*Hello Nice!
*There is a Bear behind you!

Я написал сообщение в тему "За вами медведь".список должен быть обновлен до

*There is a Bear behind you!
*Hello Whats UP?
*Good Morning
*Good Afternoon
*Hello Nice!

Я надеюсь, вы понимаете мой пример того, что я должен сделать: /

То, что я сделал до сих пор, так этоэтот код с помощью поиска в stackoverflow:

SELECT DISTINCT a.* FROM topics a LEFT JOIN messages b ON a.id = b.topic_id ORDER BY b.date DESC LIMIT 30;

этот запрос работает как талисман, однако мои таблицы тем и сообщений ЧЕРТОВЫ ОГРОМНЫ!это объяснение

+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref               | rows   | Extra                           |
+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+
|  1 | SIMPLE      | a     | ALL  | NULL          | NULL | NULL    | NULL              | 383056 | Using temporary; Using filesort |
|  1 | SIMPLE      | b     | ref  | sira,sira_2   | sira | 4       | avare_sozluk.a.id |      6 | Distinct                        |
+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+

ОН!Кстати, я использовал Distinct, потому что может быть одно или несколько сообщений.Таким образом, запрос может выбрать одну и ту же тему два или более раз. Я просто хочу, чтобы она выбрала один раз для включения в список ..

Кто-нибудь может мне помочь с выполнением этого запроса?или если у вас есть лучший запрос для перечисления, как то, что я сказал, пожалуйста, поделитесь: / я вроде новичка

Ответы [ 2 ]

0 голосов
/ 20 августа 2013

Вы можете использовать MAX function

SELECT DISTINCT a.* FROM topics a LEFT JOIN messages b ON a.id = b.topic_id ORDER BY MAX(b.date) DESC LIMIT 30; 
0 голосов
/ 23 февраля 2012

Простой обходной путь - добавить еще один столбец в таблицу тем - last_message_at, который будет содержать дату последнего сообщения.Вы обновите это поле при публикации сообщения.

Теперь вы можете сделать это

SELECT * 
FROM topics 
ORDER BY last_message_at DESC 
LIMIT 30;

Должно работать довольно быстро, если вы индексируете last_message_at.Здесь вы торгуете некоторой производительностью записи для эффективности чтения.Я предполагаю, что ваши пользователи читают больше, чем пишут.

...