MySQL Innodb次要索引的键长度

3

MySQL: 版本14.12分发5.0.51b,适用于redhat-linux-gnu(x86_64),使用EditLine封装器

SQL_1:

SELECT SQL_NO_CACHE COUNT(*) FROM `ting_song_info`;

结果:

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

explain :

+----+-------------+----------------+-------+---------------+-------------------+---------+------+---------+-------------+
| 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)

explain:

+----+-------------+----------------+-------+---------------+----------+---------+------+---------+-------------+
| 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吗?


尽可能地,请仅呈现必要的信息。使用四个空格进行缩进以使代码更易于阅读。 - tadman
请尽量只发布必要的内容来传达您的观点。用六行代码传递一个单一数字并不是很有效。 - tadman
请提供 SHOW CREATE TABLE ting_song_info 的输出。 - jeremycole
1个回答

2
在这种情况下,我认为“键长”是指以字节为单位的密钥大小。在INT列上的主键需要4个字节。由于主键始终包含在任何二级索引中,因此您最终会得到一个INT+INT的键,即4+4个字节,总共8个字节。
我不完全确定为什么这个数字会让您担心。与表示密钥所需的微不足道的字节数相比,索引结构本身具有更多的开销。
我不确定为什么您会在简单计数上使用强制索引操作。据我所知,MySQL在计数方面并没有像Postgres的新版本那样充分利用这些索引。我认为这与InnoDB的MVCC实现方式有关。
请记住,在事务性数据库中,表中的行数并不总是容易量化的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接