1

そのクエリは遅いです (約 1.5 秒)。単に投稿のリストを返す必要があります

SELECT SQL_NO_CACHE p.id
    FROM 1_posts p
    LEFT JOIN 1_topics t ON (p.cid = t.cid AND p.container = t.id)
    WHERE t.cid = 1010699;

EXPLAIN は次のようになります。

+----+-------------+-------+------+--------------- --------+-----------+---------+---------------+--- ---+--------------------------+
| | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+-------+------+--------------- --------+-----------+---------+---------------+--- ---+--------------------------+
| | 1 | シンプル | t | 参照 | プライマリ、cid | シド | 4 | 定数 | 216 | where を使用します。インデックスの使用 |
| | 1 | シンプル | p | 参照 | プライマリ、cid、コンテナー | コンテナ | 4 | フォーラムdb.t.id | 49 | where | の使用
+----+-------------+-------+------+--------------- --------+-----------+---------+---------------+--- ---+--------------------------+

SQL_NO_CACHE はテスト目的でのみ存在することに注意してください。

テーブルの部分構造:

1_投稿:

mysql> 1_posts について説明します。
+----+-------------------------------------+------+-- ---+---------+----------------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+----+-------------------------------------+------+-- ---+---------+----------------+
| | シド | int(20) 符号なし | いいえ | PRI | 0 | | |
| | ID | int(20) 符号なし | いいえ | PRI | ヌル | auto_increment |
| | コンテナ | int(20) 符号なし | いいえ | マル | 0 | | |
mysql> 1_topics を説明します。
+-----------------+-------------------------------------+------+- -+---------------------+----------------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+-----------------+-------------------------------------+------+- -+---------------------+----------------+
| | シド | int(10) 符号なし | いいえ | PRI | 0 | | |
| | ID | int(10) 符号なし | いいえ | PRI | ヌル | auto_increment |
| | コンテナ | int(20) | いいえ | マル | 0 | | |

テーブルの投稿には何百万ものエントリがあり、約 50 万件のトピックがあります。

cid と id は、両方のテーブルでプライマリ コンボ キーです。cid はコミュニティ ID を意味します。これらのテーブルは、さまざまなフォーラムを主催しています。

このことをスピードアップするためにあなたが与えることができるどんな助けにも感謝します.

4

2 に答える 2

0

クエリを見るだけで簡単にできます。

セットを t.cid = 1010699 に減らしているため、null に賭けることはできないと述べています。したがって、内部結合を使用できます。

SELECT SQL_NO_CACHE p.id 
FROM 1_posts p 
JOIN 1_topics t ON p.container = t.id 
WHERE t.cid = 1010699 AND p.cid = t.cid;

編集:

Vatev が指摘したように、 p.cid = t.cid を削除するとクエリの結果が変わります。読みやすくするために WHERE 句に追加しました

于 2013-08-09T14:28:45.157 に答える