mysql索引覆盖之innodb和myisam效率问题
2016-08-10 14:36
483 查看
问题:
create table A (
id varchar(64) primary key,
ver int,
...
)
我的表有几个很长的字段varchar(3000)
在id、ver上有联合索引
10000条数据
为什么select id from A order by id特别慢,
而select id from A order by id,ver非常快 ?
解析:
1.两条sql都使用了索引覆盖。
2.myisam存储引擎,数据行和索引节点分开存放,所以不会存在上述问题。
3.innodb存储引擎,由于数据行和主键索引节点一起存放(聚簇索引),主键索引文件会比较大,
当只按id排序读取id时,则会遍历主键索引B-TREE去读取id,由于表中的记录行有几个大字段的数据,读取时I/O跳跃会比较大,所以会特别慢;
而根据符合索引(id,ver)排序查询时,则使用innodb的辅助索引,索引节点只存储了索引数据和主键的地址,而且使用了索引覆盖,只需从索引中读取id即可,所以会非常快。
create table A (
id varchar(64) primary key,
ver int,
...
)
我的表有几个很长的字段varchar(3000)
在id、ver上有联合索引
10000条数据
为什么select id from A order by id特别慢,
而select id from A order by id,ver非常快 ?
解析:
1.两条sql都使用了索引覆盖。
2.myisam存储引擎,数据行和索引节点分开存放,所以不会存在上述问题。
3.innodb存储引擎,由于数据行和主键索引节点一起存放(聚簇索引),主键索引文件会比较大,
当只按id排序读取id时,则会遍历主键索引B-TREE去读取id,由于表中的记录行有几个大字段的数据,读取时I/O跳跃会比较大,所以会特别慢;
而根据符合索引(id,ver)排序查询时,则使用innodb的辅助索引,索引节点只存储了索引数据和主键的地址,而且使用了索引覆盖,只需从索引中读取id即可,所以会非常快。
相关文章推荐
- Mysql innodb引擎和myisam引擎使用索引区别
- mysql 索引长度tips innodb和myisam引擎
- MySQL5.5索引数在InnoDB引擎内与索引数在mysql中定义的数量是不一致问题
- MySQL线上600W纪录的MyISAM表,要把存储引擎改为innoDB,一alter表就立马锁死的问题探讨
- mysql的存储引擎innodb、myisam对插入影响和索引对插入的影响
- mysql从innodb转到MyIsam的count查询效率极大提升
- Mysql innodb引擎和myisam引擎 使用索引区别
- MySQL中MyISAM和InnoDB对B-Tree索引不同的实现方式
- mysql中的auto_increment的问题(MyISAM,InnoDB)
- MySQL中myisam和innodb的主键索引有什么区别?
- 有关 MySQL InnoDB 在索引中自动添加主键的问题
- MySQL原理研究:myisam和innodb索引实现的不同
- mysql索引的效率问题
- MySQL中myisam和innodb的主键索引有什么区别?
- MYSQL复制源文件 丢失问题解决, innoDB 类型转换为 MyISAM
- mysql 索引长度tips innodb和myisam引擎
- mysql innodb 索引失效问题引起表级锁
- MySQL之索引1 --- MyISAM和InnoDB索引实现的不同
- 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点分析
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)