2

次のフィールドを持つ「コンテンツ」テーブルがあります。

id (an unique, increasing identifier)
user_id
content1
content2
content3
...

テーブルには、同じまたは異なる からのデータを含めることができますuser_id。フィールドの 1 つでソートされたデータを選択しようとしていcontentます。idただし、個別の 'user_id' からデータを選択し、常にユーザーの最新のエントリ (つまり、最高値)を取得したいだけです。group by user_id並べ替えの前にグループ化が行われるため、単純にできません。

これは私が現在行っていることです:

SELECT *
FROM `content`
WHERE `content`.`id` = (
    SELECT `id`
    FROM `content` as `alt`
    WHERE `alt`.`user_id` = `content`.`id`
    ORDER BY `id` DESC
    LIMIT 1 )
ORDER BY content1 DESC

動作しますが、テーブルが大きくなると、パフォーマンスが非常に遅くなります。このクエリを改善する方法を教えてもらえますか?

4

2 に答える 2

3

より多くのデータで遅くなる理由は、サブクエリがテーブルの各行に対して実行されているためです。content

このソリューションは、副選択が 1 回だけ実行され、その副選択の結果が同じテーブルに結合され、インデックスを使用するため、はるかに高速である必要があります。

SELECT b.*
FROM
(
    SELECT MAX(id) AS maxid
    FROM content
    GROUP BY user_id
) a
INNER JOIN content b ON a.maxid = b.id
ORDER BY b.content1 DESC
于 2012-07-08T02:10:00.000 に答える
0

パフォーマンスのためには、1 つの完全な SQL ではなく、2 段階のアプローチが必要です。

  1. 一時テーブルを作成

    一時テーブル id_Temp を SELECT id FROMcontentとしてalt WHEREとして作成しますaltuser_id= content.id

  2. 一時テーブルからデータを選択

    SELECT * FROM content WHERE content. id= ( id_temp ORDER BY idDESC limit 1 から id を選択) ORDER BY content1 DESC

私の経験では、この 2 段階のアプローチにより一定の応答時間が得られます。このアプローチでは、1 日あたり 250 万ページの Web サイトが、安価な 2 Liunx BOX でうまく機能します。

于 2012-07-08T08:08:35.400 に答える