4

22m行のテーブルからユーザーのサブスクライバーの数を取得しようとしています。

私のSQLは次のとおりです。

SELECT
    COUNT(id)
FROM
    subscribers
WHERE
    suid=541839243781

ロードするのに12.6020秒必要です

ただし、次の同じクエリ(ユーザーのサブスクリプションを取得)は、ロードに0.0036秒しか必要ありません(問題ないようです)

SELECT
    COUNT(uid)
FROM
    subscribers
WHERE
    uid=541839243781

私の説明:

    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

作成テーブルを表示:

    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

インデックス:

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秒はこれには地獄です...

4

2 に答える 2

6

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

于 2012-04-19T17:39:37.883 に答える
0

idすることはできないので、NULL次のように書き直すことができます。

SELECT
    COUNT(*)
FROM
    subscribers
WHERE
    suid=541839243781

非常に最近の(または将来の)オプティマイザを除いて、。よりも少し高速である必要がありますCOUNT(id)


MyISAMの場合でも、4秒全体が遅すぎます。おそらく、インデックスは断片化されています。

于 2012-04-19T18:33:52.160 に答える