MySQL性能优化、创建索引

一、MySQL中,对于自增的字段,如果将这个字段设为索引,那这个字段会从二叉查询树退化成链表查询(单边查询,如:查找第6个(行)数据,将会查询6次,这是个弊端)

MySQL性能优化、创建索引

二、红黑树会自动平衡,但是二叉平衡树追求绝对平衡,红黑树是局部平衡

 

三、二叉平衡树(红黑树),优化控制高度(限制高度,延长宽度,可以减少磁盘IO),

mysql的io容量大概在16kb,可以通过show global status like 'innodb_page_size'进行查看,所以树的节点不能太大,高度控制了宽度也应该有个度

四、mysql改造了B Tree,形成独有的B+Tree  

MySQL性能优化、创建索引

MySQL性能优化、创建索引

B+Tree的右箭头属于另一种hash指针,hash查询比B+Tree查询快很多,但是缺点是:无法范围查找,或者会出现hash碰撞

MySQL性能优化、创建索引

五、存储引擎:是形容数据库中的表(不同的表对于的存储引擎也不一样,如图:)

MySQL性能优化、创建索引

六、在C:\ProgramData\MySQL\MySQL Server 5.7\Data文件夹中的文件说明

6.1、frm表结构

6.2、MYD存数据

6.3、MYI存储索引(二叉树、BTree、B+Tree)

6.4、idb索引和数据的合集(MYD和MYI合集)

不同存储引擎的底层存储结构不同,如:下图没有MYD、MYI文件(合并成ibd了)

MySQL性能优化、创建索引

6.5、idb文件结构(innoDB存储引擎)(不用回表

MySQL性能优化、创建索引

七、innoDB引擎

表数据文件本身就是按照B+Tree组织的一个索引结构文件

MySQL性能优化、创建索引

八、聚集索引(也叫聚簇索引)——innoDB引擎就是聚集索引,也就是B+Tree(叶子节点包含了完整的数据记录)

非聚集索引——MylSAM索引(索引文件与数据文件是分离的,占两个文件)

MySQL性能优化、创建索引

问:为什么innoDB表必须要有主键,并且推荐使用整形的自增主键?

答:innoDB没有建主键,会自己选择一列为主键(不重复的、合格的字段),如果没有一列合格,innoDB会自己在后台生成一个列作为主键(你看不到)。

使用整形比使用uuid查找效率更高

九、单值索引与联合索引

    联合索引的底层存储结构长什么样?

MySQL性能优化、创建索引

十、为什么非主键索引底层结构叶子节点存储的是主键值?

    一致性和节省存储空间

MySQL性能优化、创建索引

十一、explain

 

十二、MyISAM与InnoDB 的区别(9个不同点)

https://blog.csdn.net/qq_35642036/article/details/82820178

 

 

 面试题:

1、什么列不可以建立索引

     增删改比较多的

     重复类多的(name相同的)

 

2、innoDB可以不建立主键吗? 但是innoDB创建表后会出现3个隐藏字段

答:可以不建立,但是必须要有主键

  1. 会去查找一个unique并且没有null的字段作为主键
  2. row_id做为主键

 

3、为什么提倡int自增作为主键

  1. 有序
  2. 索引对比
  3. 有可能形成连续的内存空间

https://www.cs.usfca.edu/~galles/visualization/BST.html