Mysql索引

MySQL索引

什么是索引

索引(index)是帮助MySQL高效获取数据的数据结构,也就是说索引的本质就是数据结构。

生活中书本的目录就可以理解为一种索引。

MySQL中索引分类

  • 聚簇索引(聚集索引): 将数据存储与索引放到了一块,找到索引也就找到了数据
  • 非聚簇索引(二级索引):将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,MyIsam 通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。
  • 普通索引:只包含单个列的索引,一个表中可以有多个普通索引。
  • 唯一索引:索引列的值必须唯一,但允许有空值。
  • 复合索引:包含多个列的索引
  • 前缀索引:顾名思义将某一列截取内容后建立的索引。前缀索引能够有效减小索引文件大小,提高索引查询速度。但是前缀索引不能用于 order by group by

聚簇索引与非聚簇索引

MyIsam 引擎就是采用非聚簇索引,索引的叶子节点中不存放数据,而存储着主键Id和数据存储的物理地址。对于非非聚簇索引来说,每次通过索引检索到所需行后,还需要通过叶子节点上的物理地址去磁盘内取数据(回行)消耗时间。为了优化这部分回行取数据的时间,Innodb 引擎采用了聚簇索引, 叶子节点 不再存该行对应的地址,而是直接存储数据。

Innodb中,在聚簇索引之上创建的索引称之为辅助索引(非聚簇索引),辅助索引访问数据需要二次查找。像普通索引、复合索引、前缀索引、唯一索引(非主键)都是辅助索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。

由于聚簇索引是将数据与索引结构一起存储,因此 一张表仅有一个聚簇索引

**InnoDB默认对主键建立聚簇索引。如果你不指定主键,Innodb 会用一个具有唯一且非空值的索引来代替。**如果不存在这样的索引,Innodb 会定义一个 隐藏的主键,然后对其建立聚簇索引。一般来说,Innodb 会以聚簇索引的形式来存储实际的数据,它是其它二级索引的基础。

MySQL为什么建议使用自增主键

MySQL在底层是以数据页为单位来存储数据的,一个数据页的大小默认为16K,一个数据页存满了,MySQL会申请一个新的数据页来存储数据。

如果主键为自增id的话,MySQL在写满一个数据页的时候,直接申请一个新的数据页接着写就可以了。

如果主键是非自增id(uuid),为了确保有序,MySQL就需要每次将数据插入合适的位置上。为了确保有序(索引是有序的),当往一个已满的数据页插入数据时,MySQL会申请一个新的数据页,并把上个数据页中的部分数据挪到新的数据页上,这就造成了 页分裂

聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。如果主键不是自增id,那么可以想像, 它会干些什么 ,不断地调整数据页 (页分裂), 当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值