Frage

Guten Tag, ich habe eine Frage, die ich mit viel bin zu kämpfen, Hoffnung jemand gefunden bereits eine clevere Lösung für dieses (ich benutze MySQL).

Ich habe Tabelle wie folgt aus:

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

Mein Ziel ist es zuletzt eingefügten Datensatz für Benutzer auswählen und diese schnell machen. Log-Tabelle ist riesig (ca. 900k Datensätze), so mein erster Ansatz war:

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

Aber es scheint, es berechnen Unterabfrage für jede Zeile (EXPLAIN zeigt ABHÄNGIGEN QUERY). Als ich aufgespalten diese Abfrage für zwei:

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

und

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

Es ist akzeptabel, zu laufen. Kann dies durch eine Abfrage achived werden?

War es hilfreich?

Lösung

Neben Gruppe mit durch die gruppenweise Maximum abrufen möchten Sie es wahrscheinlich eine unkorrelierte Unterabfrage machen für die spezifischen Zeilen aus der Tabelle zusätzliche Felder zu holen.

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

Dies funktioniert am besten / schnellsten, wenn Sie einen Index

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

aber auch ohne diesen Schlüssel ist die Leistung Abstieg.

Andere Tipps

Wie wäre es

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

Diese erhalten Sie die maximale ID für jeden Benutzer in der Log-Tabelle, die alle in einer Abfrage!

Wenn Sie immer für das Protokoll für einen bestimmten Benutzer suchen, die Partitionierung der Protokolldatei von User_id beschleunigen würde die Dinge viel. Wenn die Tabelle durch Benutzer und indiziert durch ID partitioniert ist, wird die Abfrage sehr schnell ausgeführt werden.

EDIT: siehe Dominiks Abfrage

Darüber hinaus würde ich sicherstellen, dass Sie einen Index für user_id haben.

EDIT: verallgemeinert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top