咱们这里关注B+树的两个特性:html
以用户表为例,id
为主键,另外name存在索引idx_name
:mysql
CREATE TABLE `t_user` ( `id` bigint, `name` varchar(10), `age` int, PRIMARY KEY (`id`), KEY `idx_name` (`name`) );
插入数据:sql
insert into t_user (id,`name`,age) values (1,'n7',10), (2,'n6',20), (3,'n5',30), (4,'n4',40), (5,'n3',50), (6,'n2',60), (7,'n1',70)
聚簇索引:行数据与键值(主键)紧凑地存储在一块儿;数据库
InnoDB中表现为:B+树叶子节点的data用于存放行数据(包含主键值、其余列数据、回滚指针、事务id等),物理上索引数据与行数据都放在同一个文件中(.ibd
)安全
若是没有定义主键,InnoDB会选择一个非空的惟一索引代替。若是没有这样的索引,InnoDB会隐式定义一个主键(DB_ROW_ID)来做为聚簇索引。
与聚簇索引最大的不一样是:B+树的data存放的并非行数据,而是主键值;数据结构
当select * from t_user where name='n1'
时,会先经过idx_name
索引找到n1
对应的主键的值(id=7),再经过主键值找到行数据 [7,n1,70] 。并发
与InnoDB不一样,MyISAM并不使用聚簇索引,MyISAM的索引数据和行数据是分开的,物理上分别为.myi
索引数据文件和.myd
行数据文件(InnoDB 索引和行数据均在.idb
文件中)性能
MyISAM中,主键索引和其余的通常索引在数据结构上并没有什么区别,B+树的data存放的均是数据行地址。插件
主键索引:3d
普通索引:
mysql支持三种锁定级别,行级、页级、表级;
MyISAM支持表级锁定,提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)
InnoDB支持行级锁,但值得注意的是InnoDB的行锁是加到索引上的,因此在某次查找时没有用上索引,InnoDB表一样会锁全表。
InnoDB具备事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。若是应用中须要执行大量的INSERT或UPDATE操做,则应该使用InnoDB,以事务为单位操做能够提升多用户并发操做的性能。
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。若是应用中须要执行大量的SELECT查询,那么MyISAM是更好的选择
MyISAM读写互相阻塞:不只会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读自己并不会阻塞另外的读。
InnoDB 读写阻塞与事务隔离级别相关。
MyISAM支持FULLTEXT类型的全文索引
InnoDB不支持FULLTEXT类型的全文索引,可是InnoDB可使用sphinx插件支持全文索引,而且效果更好
MyISAM不支持
InnoDB支持
InnoDB不保存表的具体行数,执行select count(*) from table时须要全表扫描。
MyISAM用一个变量保存了整个表的行数,执行上述语句时只须要读出该变量便可,速度很快;
https://www.jianshu.com/p/8e054da3da05