关于mysql select*走非聚集索引的疑惑

duzq1985 2011-11-29 11:27:36
今天无意中发现的情况,请帮忙解答下,按说下面的t1表的select * from t1的查询应该走主键索引才最快,
为什么优化器却走了非聚集索引,这样的话不是要遍历两个索引树么?难道优化器二了,我加了force index(id)都不走主键,非常不解,求解释。

mysql> show create table t1;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 5 | NULL |
| 6 | NULL |
| 7 | NULL |
| 8 | NULL |
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+----+------+
8 rows in set (0.00 sec)

mysql> explain select * from t1;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | t1 | index | NULL | idx_name | 48 | NULL | 8 | Using index |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
1 row in set (0.00 sec)
...全文
136 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2011-11-29
  • 打赏
  • 举报
回复
你的SELECT * 等同于 Select id,name , 而MYSQL通过索引信息可以知道在你的idx_name 索引中包含了 name,id 两个字段的信息。这样MYSQL不需要去访问数据文件,直接遍历索引信息就可以得到 Select id,name
rucypli 2011-11-29
  • 打赏
  • 举报
回复
因为你就俩字段 你再加个age字段试试
duzq1985 2011-11-29
  • 打赏
  • 举报
回复
谢谢楼上两位的解答,尤其是楼上这位,每次都能碰到你,热心人啊,

自己居然没想到这点,想当然的认为走非聚集索引必须还要走聚集索引,

呵呵

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧