3

MySQL:Ver 14.12 Distrib 5.0.51b、EditLineラッパーを使用したredhat-linux-gnu(x86_64)用

sql_1:

SELECT SQL_NO_CACHE COUNT(*) FROM `ting_song_info`;

結果 :

+----------+
| COUNT(*) |
+----------+
|  2637447 | 
+----------+
1 row in set (0.42 sec)

説明 :

+----+-------------+----------------+-------+---------------+-------------------+---------+------+---------+-------------+
| id | select_type | table          | type  | possible_keys | key               | key_len | ref  | rows    | Extra       |
+----+-------------+----------------+-------+---------------+-------------------+---------+------+---------+-------------+
|  1 | SIMPLE      | ting_song_info | index | NULL          | total_listen_nums | 4       | NULL | 2769410 | Using index | 
+----+-------------+----------------+-------+---------------+-------------------+---------+------+---------+-------------+

sql_1はキーを使用しますtotal_listen_nums

次に、キーを指定します。

sql_2:

SELECT SQL_NO_CACHE COUNT(*) FROM `ting_song_info` USE KEY(`album_id`);

結果 :

+----------+
| COUNT(*) |
+----------+
|  2637447 | 
+----------+
1 row in set (5.21 sec)

説明:

+----+-------------+----------------+-------+---------------+----------+---------+------+---------+-------------+
| id | select_type | table          | type  | possible_keys | key      | key_len | ref  | rows    | Extra       |
+----+-------------+----------------+-------+---------------+----------+---------+------+---------+-------------+
|  1 | SIMPLE      | ting_song_info | index | NULL          | album_id | 8       | NULL | 2769410 | Using index | 
+----+-------------+----------------+-------+---------------+----------+---------+------+---------+-------------+

total_listen_numsのkey_lenは、album_idよりもショットが多いです。

これがsql_1がtotal_listen_numsを使用する理由ですか?

4

1 に答える 1

2

この場合、「キーの長さ」はバイト単位のキーのサイズを指すと思います。INT列の主キーには4バイトが必要です。主キーは常にセカンダリインデックスに含まれているため、最終的にINT+ INT、または4+4バイトのキーで8が生成されます。

この数があなたにとって懸念される理由は完全にはわかりません。インデックス構造自体には、キーを表すために必要な重要でないバイト数よりもかなり多くのオーバーヘッドがあります。

単純なカウントで強制インデックス操作を使用する理由がわかりません。MySQLは、Postgresの新しいバージョンとは異なり、私が知る限り、カウントにこれらのインデックスをあまり使用していません。これは、InnoDBのMVCCの実装方法と関係があると思います。

トランザクションデータベースのテーブルの行数は、必ずしも簡単に数値化できるとは限りません。

于 2013-02-20T04:36:35.867 に答える