Mysql为什么要使用索引,一般索引结构是什么样的?

1、Mysql引擎InnoDb下,使用索引能快速定位到数据。

索引分类:主索引(一级索引,聚簇索引),二级索引(非主键索引)

注:聚簇索引的特点是该列数据具有唯一性的,并不一定聚簇索引就一定是主键索引,但主键索引一定是聚簇索引。

2、Mysql的索引数据结构是B+树

为什么是B+tree呢,而不是单链表,或者是Btree

这是B+tree的性质决定的。

链表显然有致命的缺点:千万数据的索引,如果用链表作为索引,最差情况需要千万次IO,因为数据只有读到内存中才能比较是否拿到需要的数据。链表一个节点只有一node,node与node之间通过指针关联,在磁盘上的地址并不是相邻的,所以一次IO只能读取一个Node数据,不能预读(见文章底部注释)。

Btree:平衡多路查找树,叶子节点和非叶子节点都存在真实记录数据。

B+tree:是对Btree的优化,索引数据结构就是B+tree,相对于Btree的区别,B+tree非叶子节点只存key的范围,叶子节点才存索引值和真实数据(主索引)

3、比较Btree和B+tree的区别,

Btree非叶子节点也存数据,导致Btree的深度增加,那么IO次数相应增加。

Btree数据查找,可能会涉及深度多层查找,而B+tree查找只会在叶子节点查找索引数据,叶子节点之间存在链表指针结构。

4、B+tree的结构中在之前文章中算过千万数据级别深度在2-3左右https://blog.csdn.net/styhm/article/details/109512895。一个节点即为一个索引page页,这里的page是可能是讲多个磁盘块通过b+tree指针关联到一起,在一次IO中可以通过预读将一个page的数据全部加载到内存中。这里就是和链表索引的关键不同的地方。

5、聚簇索引和非聚簇索引在B+tree中的存在数据不一样

聚簇索引:叶子节点存的是整行的数据

二级索引:叶子节点存的是该列的key+主键(如果只查询该列数据作为结果,那么索引覆盖,否则会通过主键回表查询)

复合索引:复合索引全部列+主键(复合索引使用时,注意最左匹配原则)

6、索引字段长度问题

InnoDB下要求索引字段不能超过767 bytes,如果超过则会截取前767 bytes作为前缀索引

varchar在utf8编码下一个字符占3byte,所有如果要用此字段作为索引尽量定义varchar(255),255*3 = 765.

另外MySQL要求一个行定义长度不能超过 65535 bytes,也就是varchar不能超过21845。

 

 

 

 

 

 

 

 

①.IO时间:寻道时间+旋转延迟+数据传输时间, 其中主要耗时间的是寻道时间(3-15ms)和磁盘旋转时间60*1000/7200/2 = 4.17ms,

②.IO预读:在IO确定磁盘地址后,讲地址相邻的数据也读进内存,作为一次IO的内容。

③.IO字节数:一般IO最大可以达到2048k,在mysql中配置innodb_data_read,是每次IO的数据量大概16k,参考文章https://www.cnblogs.com/cenalulu/archive/2013/10/16/3370626.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值