MySQL Innodb二级索引的密钥长度

时间:2013-02-20 04:28:03

标签: mysql innodb

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?

1 个答案:

答案 0 :(得分:2)

在这种情况下,我认为“密钥长度”是指密钥的大小(以字节为单位)。 INT列上的主键需要4个字节。由于主键始终包含在任何辅助索引中,因此您最终会获得INT + INT或4 + 4字节的密钥以产生8。

我不完全确定为什么这个号码会引起你的关注。索引结构本身的开销远远大于表示密钥所需的无关紧要的字节数。

我不确定为什么你会在一个简单的计数上使用强制索引操作。据我所知,与新版本的Postgres不同,MySQL并没有充分利用这些索引。我相信这与InnoDB的MVCC如何实现有关。

请记住,事务数据库中表中的行数并不总是很容易量化。