2

ニュース スクリプトをセットアップして、最新の 5 件の投稿 (現在表示されている投稿と同じカテゴリから - 現在表示されている投稿を除く) を表示するようにしました。

私のSQLは次のようになります:

SELECT title, sid, url, category
FROM news 
WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5

クエリの EXPLAIN は次のとおりです。

+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
| id | select_type | table    | type | possible_keys    | key      | key_len | ref   | rows | Extra       |
+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | news     | ref  | PRIMARY,category | category | 98      | const |  154 | Using where |
+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

私が疑問に思っているのは、5 つの結果を取得するために非常に多くの行をスキャンする必要がないように、クエリを最適化する方法はありますか?

編集

カテゴリ インデックスの結果:

mysql> EXPLAIN EXTENDED SELECT title, sid, url, category FROM news WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: news
         type: ref
possible_keys: PRIMARY,category
          key: category
      key_len: 98
          ref: const
         rows: 156
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

カテゴリ インデックスなしの結果:

mysql> EXPLAIN EXTENDED SELECT title, sid, url, category FROM news WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: news
         type: index
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 2
          ref: NULL
         rows: 5
     filtered: 7420.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
4

3 に答える 3

3

編集:この答えは機能しません

以下の@Mayhemのコメントに基づいて、列インデックスを降順で指定しても何もしませんが、将来何かをするかもしれません. これは、バージョン 5.7でも当てはまります。DESC人々は使用すると実際に何か を行うと考えるかもしれないので、これはこれを維持するのに役立つと思います。

元の回答

sid降順でインデックスを作成する場合(順序が重要です)、それを ORDER BY 句で使用すると、結果が大幅に改善されます。

create ステートメントは次のようになります。

CREATE INDEX IX_news_category_sid
    ON news (category, sid DESC)
于 2013-09-20T06:11:05.633 に答える
0

最新のテーブル用に別のテーブルを作成できます。これは、1,000 万行を超える場合に非常に便利です。挿入と削除のための実際のテーブルのトリガーを作成するだけで、常にレコードを更新し、必要な行数だけを保持できます。

于 2013-09-20T06:13:46.917 に答える