テーブルからのみ、最新のレコードを選択し、このFASTを作る、どのように?
-
19-09-2019 - |
質問
こんにちは、私は、私はたくさんの苦労疑問を持っている誰かがすでに(私はMySQLを使用して)これに対する巧妙な解決策を見つけた願っています。
私はこのようなテーブルを持っています:
Table `log`
----------
id
inserted
message
user_id
私の目標は、ユーザーのために最後に挿入されたレコードを選択し、これを高速にすることです。ログテーブルには、巨大な(900K周りの記録)であります ので、私の最初のアプローチでした。
SELECT * FROM `log`
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN
(
SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
)
しかし、行ごとにサブクエリを計算する(番組に依存性QUERYをEXPLAIN)ようです。私は2つのために、このクエリを分割する場合:
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...)
実行することが可能です。これは、一つのクエリことで回避でき?
解決
グループごとの最大値を取得することにより、グループの使用に加えて、あなたはおそらく、テーブルから特定の行の追加フィールドをフェッチする非相関サブクエリにしたい。
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`)
それでも、そのキーなしでパフォーマンスが降下されます。
他のヒント
どの程度
SELECT user_id, max(id) FROM `log` GROUP BY user_id
これは、すべて1つのクエリでは、あなたのログテーブル内のすべてのユーザーのための最大のIDを取得します!
あなたは、常に多くの物事をスピードアップするでしょうuser_idをして、ログファイルを分割する、特定のユーザーのログを探している場合。テーブルは、ユーザーによって仕切らとidでインデックス化されている場合は、クエリが非常に高速に実行されます。
EDIT:ドミニクのクエリを参照してください。
また、私はあなたがUSER_IDにインデックスを持っていることを確認します。
EDIT:一般
所属していません StackOverflow