2012-04-17 16 views
0

の "インデックスの使用" 私は、ユーザーSQLクエリ遅すぎるEXPLAIN

私のクエリのすべての加入者を取得しようとしています:

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 ║ Using index ║ 
╚════╩═════════════╩═══════╩══════╩═══════════════╩═════╩═════════╩═══════╩═══════╩═════════════╝ 

そうで私が得た合計カウントは約48kであり、ロードするのに0.0333がかかります...これが1mまたは5mになるとどうなりますか?それはアップロードするために年齢を取ることができる...加入者のテーブルの上に

私のインデックスは、次のとおりです。

 
╔═════════════╦════════════╦═══════════════════╦══════════════╦═════════════╦═══════════╦═════════════╦══════════╦════════╦══════╦════════════╦═════════╗ 
║ Table ║ Non_unique ║  Key_name  ║ Seq_in_index ║ Column_name ║ Collation ║ Cardinality ║ Sub_part ║ Packed ║ Null ║ Index_type ║ Comment ║ 
╠═════════════╬════════════╬═══════════════════╬══════════════╬═════════════╬═══════════╬═════════════╬══════════╬════════╬══════╬════════════╬═════════╣ 
║ subscribers ║   0 ║ PRIMARY   ║   1 ║ id   ║ A   ║  60251 ║ NULL  ║ NULL ║  ║ BTREE  ║   ║ 
║ subscribers ║   1 ║ total_subscribers ║   1 ║ id   ║ A   ║  60251 ║ NULL  ║ NULL ║  ║ BTREE  ║   ║ 
║ subscribers ║   1 ║ total_subscribers ║   2 ║ suid  ║ A   ║  60251 ║ NULL  ║ NULL ║  ║ BTREE  ║   ║ 
║ subscribers ║   1 ║ i3    ║   1 ║ suid  ║ A   ║  6025 ║ NULL  ║ NULL ║  ║ BTREE  ║   ║ 
║ subscribers ║   1 ║ i3    ║   2 ║ uid   ║ A   ║  60251 ║ NULL  ║ NULL ║  ║ BTREE  ║   ║ 
║ subscribers ║   1 ║ i3    ║   3 ║ id   ║ A   ║  60251 ║ NULL  ║ NULL ║  ║ BTREE  ║   ║ 
╚═════════════╩════════════╩═══════════════════╩══════════════╩═════════════╩═══════════╩═════════════╩══════════╩════════╩══════╩════════════╩═════════╝ 

はので、どのように私はこのクエリは、より効率的に行うことができますか?

+0

データを正しく読み取っている場合、「suid」列の専用インデックスはありません。 「suid」列の値は、グローバルに、または各サブスクライバに対してのみユニークですか? –

+0

編集済みのインデックス、1つのインデックスを忘れました – fxuser

答えて

1

おそらくできません。

つまり、COUNT演算が必然的に行数に比例してスケーリングされると思います。 100万行で0.0333秒ではなく0.12秒かかることがあります。

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

0

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

エラー:これはMS SQL Serverに適用されます。申し訳ありません。

1

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

+0

IDはAUTO_INCREMENTカラムですが、速度を上げるようなことはありません...私はまだ同じ速度になります – fxuser

+0

クエリ時間の変化を調べるには、大きなデータセットが必要です総数で500万行を作成してテストしてみてください。 1.2m行の –

+0

は0.2秒かかるので、5mで1〜1.5秒かかると思います...これは0.002のようなものに縮小されますか?どのように他のサイトがdbからそのような数字を得ているのでしょうか?新しいレコードが作成/削除されるたびにどこかに保存してカウントを増減しますか? – fxuser