3

MySQL:Ver 14.12 Distrib 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)

解释 :

+----+-------------+----------------+-------+---------------+-------------------+---------+------+---------+-------------+
| 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 回答