MySQL知识点整理

142 阅读6分钟

1.B树和B+树之间的区别是什么?

B树:

image.png 特点:1、一个节点里有多个元素

2、有序,节点的左边都是比右边小的

3、节点内部的元素也是有序的,遵循左小右大

B+树:

image.png 特点:1、叶子节点之间有指针

         2、一个节点里有多个元素

         3、非叶子节点的元素都冗余了一份在叶子节点上

         4、节点内部的元素也是有序的,遵循左小右大

B树和B+树的主要区别在于

1、B+树所有关键码都在叶子节点

2、B+树的叶子节点是带有指针的,且叶节点本身按关键码从小到大顺序连接

3、在搜索过程中,如果查询和内部节点的关键字一致,那么搜索过程不停止,而是继续向下搜索这个分支

 

 

2.Innodb中的B+树有什么特点?

有索引的情况下,InnoDB通过主键查找记录的流程。先将B+树的根节点页面加载到内存,通过Page Directory使用二分法快速定位到分组,遍历组内的目录项,通过页号定位到第二层页节点,将该节点页加载到内存,重复前面的过程,直到定位到叶子节点页,最终获取到记录。加载数据页的个数,其实就是B+树的高度,而且InnoDB B+树有个特点,就是根节点一旦确定就不会改变,这样InnoDB就可以将根节点页做缓存了,进一步减少页的加载次数。

 

 

3.什么是Innodb中的page?

默认情况下Innodb的一页大小为16kb,当Innodb向磁盘读取数据时,最小的单位就是一页,即16kb。

插入数据时就已经根据主键的大小进行排序。

目录会存放一个指向各组首位的指针,以及首位的索引。(空间换时间)

会有一个总的目录页,存放各页页目录中最小的索引。

高度为2的B+树可以存放1kb的数据26208(16kb1024/10b16kb/1kb)个,高度为3的B+树可以存放1kb的数据42928704(1638*26208)

 

 

 

4.Innodb中的B+树是怎么产生的?

数据存储时,会先分页,再分组,依据是主键的大小。

以三层B+树为例,每一页都会有一个页目录,每一页的用户数据区域都会进行分组,页目录的索引有指针指向每组的第一个数据,且存有每组第一个数据的主键,页与页之间有指针向连接。这里就已经是两层了,第三层与上述类似,第三层的页目录对第二层的页目录进行分组,指针指向分组内第一个页,存储分组第一页中的第一组的第一个数据。

 

 

5.什么是聚簇索引?

从上往下叫聚簇索引

从左往右叫全盘扫描

 

 

6.Innodb是如何支持范围查找能走索引的?

与精确查找一样,先找确定范围的那组数据,后大于该数据主键的数据就是向右的数据全部取出,小于该数据主键的数据就是向左的数据全部取出。

 

 

7.什么是联合索引?对应的B+树是如何生成的?

与上述B+树类似,但是在叶节点上有不同。

根据联合索引条件生成树,在叶节点不是存放的对应条件的某几个字段,而是主键索引,该主键索引指向对应主键的数据。

 

 

8.什么最左前缀原则?

与sql语句中where后面的条件顺序无关。

指给的条件与索引顺序是否匹配。比如索引的最左边有一个字段b,那么给的条件中间有无b字段的添加。

比如以bcd字段为索引,那么最左边的字段为b,则该字段b必须在where后的条件中出现。

 

 

9.为什么要遵守最左前缀原则才能利用到索引?

联合索引构建时候按照最左前缀原则构建的,只有满足最左前缀原则才可以从索引树上从上往下找。

 

 

10.什么是索引条件下推?

理解为索引条件下推优化。

获取下一行的索引信息。

检查索引中存储的列信息是否符合索引条件,如果符合将整行数据读取出来,如果不符合跳过读取下一行。

用剩余的判断条件,判断此行数据是否符合要求,符合要求返回数据。

 

 

11.什么是覆盖索引?

假设一张表有abcde五个字段,以bcd三个字段为索引条件,搜索的字段只需要b字段,那么当满足要求的数据搜索出来时,由于包括了b字段的内容,因此只需要从索引的数据中把需要的字段直接提出返回,不用回表。而由于以bcd为索引条件的B+树中的叶节点里存放着主键索引,因此以abcd为索引条件时,也为覆盖索引。

 

 

12.有哪些情况会导致索引失效?

1、不满足最左前缀原则;

2、order by(通过bcd索引,返回全部字段数据时 );

3、字段数据类型转换时候,字符和数字比较时候,会把字符转为数字再进行比较,此时原有的顺序可能会被打乱;

4、范围查找时候也可能。

 

题外:

1.MySQL有插件式的表存储引擎,这是区别于其他数据库的最重要的一个特点。

image.png

image.png

 

2.MyISAM和Innodb的区别有以下几点:

1、Innodb支持事务,MyISAM不支持事务。

2、Innodb支持外键,MyISAM不支持。

3、Innodb是聚集索引,MyISAM是非聚集索引。

4、Innodb不保存表的具体行数,执行select count (*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,只需读出该变量,速度很快。

5、Innodb最小的锁粒度是行锁,MyISAM最小的锁粒度是标锁。

 

 

3.MySQL索引按字段特性分类可分为:主键索引、普通索引、前缀索引

4.Innodb一棵B+树可以存放约两千万行数据

3.如何提高insert的性能?

1、合并多条insert为一条。

2、修改参数bulk_insert_buffer_size,调大批量插入的缓存。

3、设置innodb_flush_log_at_trx_commie=0。

4、手动使用事务(手动提交事务)。