質問

こんにちは、私は、私はたくさんの苦労疑問を持っている誰かがすでに(私は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:一般

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top