bitscn.com创建2张用户表user、user2,表结构相同,但user表使用innodb存储引擎,而user2表则使用 myisam存储引擎。
-- table user ddl
create table `user` (
`id` int(11) not null auto_increment,
`name` varchar(50) default null,
`email` varchar(100) default null,
`age` tinyint(4) default null,
`nickname` varchar(50) default null,
primary key (`id`),
unique key `email` (`email`),
key `name` (`name`),
key `age` (`age`)
) engine=innodb default charset=utf8;
-- table user2 ddl
create table `user2` (
`id` int(11) not null auto_increment,
`name` varchar(50) default null,
`email` varchar(100) default null,
`age` tinyint(4) default null,
`nickname` varchar(50) default null,
primary key (`id`),
unique key `email` (`email`),
key `name` (`name`),
key `age` (`age`)
) engine=myisam auto_increment=131610 default charset=utf8;
分别插入10w条测试数据到表user & user2。
对索引的使用分析
explain select * from user where id>100 /g;
图1
explain select * from user2 where id>100 /g;
图2
user 表中的数据和 user2 表中的数据是一样的,索引结构也是一样的,只不过它们的存储引擎不同。在图1中,查询用到了primary主键索引,而查询优化器预估的结果大概在65954行左右(实际是131513);在图2中,查询却没有使用索引,而是全表扫描了,返回的预估结果在131608行(实际是131509)。
explain select * from user where id>100 and age>50 /g;
图3
explain select * from user where id>100 and age=50 /g;
图4
explain select * from user2 where id>100 and age>50 /g;
图5
explain select * from user2 where id>100 and age=50 /g;
图6bitscn.com