2012-04-19 10 views
4

22mの行を持つテーブルから、ユーザの購読者数を取得しようとしています。以下同じクエリは、(ユーザーのサブスクリプションを取得します)しかし、(のみ0.0036秒ロードする必要があるmysql COUNT()num rows too slow

をロードするために12.6020秒を必要と

SELECT 
    COUNT(id) 
FROM 
    subscribers 
WHERE 
    suid=541839243781 

私のSQLは以下のとおりです。

SELECT 
    COUNT(uid) 
FROM 
    subscribers 
WHERE 
    uid=541839243781 

はEXPLAIN私の)OKらしい:

id select_type  table   type possible_keys key key_len  ref  rows     Extra 
    1  SIMPLE dvx_subscribers index  4   4  16  NULL 22041275 Using where; Using index 

SHOWは、CREATE TABLE:

CREATE TABLE `subscribers` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`sid` bigint(20) unsigned NOT NULL, 
`uid` bigint(20) unsigned NOT NULL, 
`suid` bigint(20) unsigned NOT NULL, 
`date` datetime NOT NULL, 
KEY `id` (`id`), 
KEY `2` (`uid`,`suid`), 
KEY `4` (`suid`,`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=23226599 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

INDEXES:

Table Non_unique Key_name Seq_in_index Column_name  Collation Cardinality  Sub_part Packed Null Index_type Comment 
subscribers  1 id 1 id A NULL NULL NULL  BTREE 
subscribers  1 2 1 uid  A 449821 NULL NULL  BTREE 
subscribers  1 2 2 suid A 459193 NULL NULL  BTREE 
subscribers  1 4 1 suid A 6115 NULL NULL  BTREE 
subscribers  1 4 2 id A 22041275 NULL NULL  BTREE 

どのように私はインデックスそれか、できるだけ速くロードするためにそれを最適化することができますか?原因は12秒です。

+1

'id'と' suid'、または 'suid'だけでインデックスを作成します。 @DanielKamilKozar。 –

+0

なぜ 'suid'だけでいいの? (あなたがそれを省略したところで答えをアップアップしました...) – gdoron

+0

4秒間定数かそれとも変量ですか? –

答えて

6

2番目のクエリはインデックス(uid)に対して実行されるため、ほとんど瞬時に完了します。ただし、最初に使用するインデックスはないため、テーブルをスキャンする必要があります。この問題を解決するには、(suid, id)にインデックスを作成します。

+1

インデックスは最初に 'suid'でなければなりません。 –

+0

@ MarkBannister訂正ありがとう! – dasblinkenlight

+0

インデックスはEXPLAINで動作するようですが、クエリとして実行するとSELECTには12秒かかります...それは奇妙です... – fxuser

0

idNULLすることはできませんので、あなたに書き換えることができ、:ごく最近の(または将来の)オプティマイザを除き

SELECT 
    COUNT(*) 
FROM 
    subscribers 
WHERE 
    suid=541839243781 

を、それがCOUNT(id)より少し速くする必要があります。


MyISAMの場合でも、4秒間で音が遅くなりすぎます。インデックスが断片化されている可能性があります。

+0

まだ同じ時間...断片化されたとはどういう意味ですか?どのようにEXPLAINが非常に速く、SELECTに12秒かかりますか? – fxuser

+0

'EXPLAIN'はクエリプランを示します。実際のテーブルは検索されません。 –

+0

それはINDEXESが使用されているとも言えますが、これは正しいのですか?それでもまだ時間がかかりますか?これは非常に奇妙です... – fxuser