0

ユーザーのすべてのサブスクライバーを取得しようとしています

私の質問:

SELECT
    COUNT(sub.id) as ids
FROM
    subscribers as sub
WHERE
    suid=541839243781

EXPLAIN プリント:

╔════╦═════════════╦═══════╦══════╦═══════════════ .
║ id ║ select_type ║ table ║ type ║ possible_keys ║ key ║ key_len ║ ref ║ rows ║ Extra ║
╠════╬═════════════╬═══════╬══════╬═══════════════ .
║ 1 ║ SIMPLE ║ sub ║ ref ║ i3 ║ i3 ║ 8 ║ const ║ 47890 ║ インデックスの使用 ║
╚════╩═════════════╩═══════╩══════╩═══════════════ .

現時点では、取得した合計数は約48kであり、ロードに時間がかかり0.0333ます...これが1mまたは??になったらどうなりますか5m?? その後、ロードするのに何年もかかる可能性があります...

サブスクライバー テーブルの私のインデックスは次のとおりです。

╔═════════════╦════════════╦═══════════════════╦══ ════════════╦═════════════╦═══════════╦═══════════ ══╦══════════╦════════╦══════╦════════════╦═══════ ══╗
║ 表 ║ Non_unique ║ Key_name ║ Seq_in_index ║ Column_name ║ 照合 ║ カーディナリティ ║ Sub_part ║ Packed ║ Null ║ Index_type ║ コメント ║
╠═════════════╬════════════╬═══════════════════╬══ ════════════╬═════════════╬═══════════╬═══════════ ══╬══════════╬════════╬══════╬════════════╬═══════ ══╣
║ サブスクライバ ║ 0 ║ プライマリ ║ 1 ║ id ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ サブスクライバー ║ 1 ║ total_subscribers ║ 1 ║ id ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ サブスクライバー ║ 1 ║ total_subscribers ║ 2 ║ suid ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ サブスクライバー ║ 1 ║ i3 ║ 1 ║ suid ║ A ║ 6025 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ サブスクライバー ║ 1 ║ i3 ║ 2 ║ uid ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ サブスクライバ ║ 1 ║ i3 ║ 3 ║ id ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
╚═════════════╩════════════╩═══════════════════╩══ ════════════╩═════════════╩═══════════╩═══════════ ══╩══════════╩════════╩══════╩════════════╩═══════ ══╝

では、このクエリをより効率的にするにはどうすればよいですか?

4

3 に答える 3

1

idはNULL値を許可しますか?そうでない場合は、に変更するSELECT COUNT(*)と、エンジンはテーブルデータを参照せずにインデックスのみからクエリに応答できるようになります。これにより処理が高速化され、MySQLがカーディナリティ統計を保存および取得する方法によっては、クエリが瞬時に実行される可能性があります。

于 2012-04-17T17:42:37.373 に答える
1

おそらくできません。

そうは言っても、COUNT 操作は必然的に行数に比例してスケーリングすると予想されます。100 万行の場合、0.0333 秒ではなく 0.12 秒かかることがあります。

実際に問題が発生した場合は、事前計算とキャッシュを使用してこれを解決できる場合があります。たとえば、カウントを計算してテーブルに格納する 1 時間ごとのジョブがあるとします。カウントは最大 1 時間遅れる可能性がありますが、取得ははるかに高速になります。

于 2012-04-17T17:13:04.530 に答える
0

sys.tables を sys.partitions に結合できます。テーブルの行統計がそこに格納されます。

エラー: これは MS SQL Server に適用されます。

于 2012-04-17T17:26:21.390 に答える