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?
答案 0 :(得分:2)
在这种情况下,我认为“密钥长度”是指密钥的大小(以字节为单位)。 INT
列上的主键需要4个字节。由于主键始终包含在任何辅助索引中,因此您最终会获得INT
+ INT
或4 + 4字节的密钥以产生8。
我不完全确定为什么这个号码会引起你的关注。索引结构本身的开销远远大于表示密钥所需的无关紧要的字节数。
我不确定为什么你会在一个简单的计数上使用强制索引操作。据我所知,与新版本的Postgres不同,MySQL并没有充分利用这些索引。我相信这与InnoDB的MVCC如何实现有关。
请记住,事务数据库中表中的行数并不总是很容易量化。