Выберите только самые новые записи из таблицы и сделайте это БЫСТРО, как? - PullRequest
2 голосов
/ 10 февраля 2010

Добрый день, у меня есть вопрос, с которым я много борюсь, надеюсь, кто-то уже нашел умное решение этого (я использую MySQL).

У меня есть такая таблица:

Table `log`
----------
id
inserted
message
user_id

Моя цель - выбрать последнюю вставленную запись для пользователя и сделать это быстро. Таблица журналов огромна (около 900 тыс. Записей), поэтому мой первый подход был:

SELECT * FROM `log` 
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN 
(
 SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
)

Но, похоже, он рассчитывает подзапрос для каждой строки (EXPLAIN показывает ЗАВИСИМЫЙ ЗАПРОС). Когда я делю этот запрос на двоих:

SELECT MAX(`id`) FROM `log` GROUP BY `user_id`

и

SELECT * FROM `log` 
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN (....ids from first query...)

Допустимо бежать. Может ли это быть достигнуто одним запросом?

Ответы [ 4 ]

4 голосов
/ 10 февраля 2010

Как насчет

SELECT user_id, max(id) FROM `log` GROUP BY user_id

Это даст вам максимальный идентификатор для каждого пользователя в таблице журнала, все в одном запросе!

1 голос
/ 10 февраля 2010

Помимо использования group by для извлечения максимума по группе, вы, вероятно, захотите сделать его некоррелированным подзапросом для извлечения дополнительных полей для определенных строк из таблицы.

SELECT
  la.user_id,la.message
FROM
  `log` as la
INNER JOIN
  (
    SELECT
      user_id, MAX(id) AS maxid
    FROM
      `log`
    GROUP BY
      user_id
    ) as lb
ON
  la.id = lb.maxid

Это работает лучше всего / быстрее, если у вас есть индекс

KEY `foo` (`user_id`,`id`)

но даже без этого ключа производительность снижается.

1 голос
/ 10 февраля 2010

Если вы всегда ищете журнал для конкретного пользователя, разделение файла журнала по user_id значительно ускорит процесс. Если таблица разделена на пользователя и проиндексирована по id, запрос будет выполняться очень быстро.

РЕДАКТИРОВАТЬ: см. Запрос Доминика

0 голосов
/ 10 февраля 2010

Кроме того, я бы позаботился о том, чтобы у вас был индекс user_id.

РЕДАКТИРОВАТЬ: обобщенный

...