mysql面试题汇总

 一、索引的失效场景:

1、模糊查询Like 使用如%like,将不走索引。

2、在索引字段是上使用函数,将不走索引,因为使用索引的字段都是数据表中的字段,如果使用了函数将导致该字段的所有值都将参数计算,成本太大。

3、在建立符合索引时没有遵循最左匹配原则,那么什么是最左匹配原则呢?比如在(name,age,sex)上建立索引,如果查询时age=28 and sex =“男” 或 sex =“男” 或 age=28 都将放弃使用索引。

4、在普通索引情况下使用 != , >= , <=  都将不走索引,在主键索引时走的

5、order by在普通索引下,select 字段时 from table,字段也必须是索引字段,否则将不走索引,因为我们在排序时如果查询的字段不存在将导致查询的字段还需要再次定位到相关字段。

6、普通索引在类型不匹配的,将不走索引。

二、创建索引应该注意什么呢,基于上面的失效场景。

1、遵循最左匹配原则。

2、尽量选择区分度高的列作为索引,也就是说使用干净一点的数据。

3、小表不使用索引,因为小表也占用内存空间。

4、索引列不能参与计算

三、索引的分类

1、普通索引

2、唯一索引 主键索引不能为空,唯一索引可以为空

3、联合索引  联合主键索引 联合唯一索引 联合普通索引

4、全文索引 大文本的情况下使用

5、空间索引

四、索引的原理:mysql主要是使用b+树来实现的

我们先来一张图:图片来源https://www.cnblogs.com/bypp/p/7755307.html

                    

b+树是b树的一种拓展,那么b树又是什么呢?我们先来看下b树的定义

假设存在B树T存在节点x,那么有如下性质

1、每个节点x
    有下面属性: 
  a. x.n,当前存储在节点x中的关键字的个数。 
  b. x.n个关键字本身x.key1,x.key2,...,x.keyx.n


 2、每个内部节点x包含x.n+1个指向其孩子的指针x.c1,x.c2,...,x.cx.n+1 。叶节点没有孩子,所以他们的ci属性没有意义。 

3、关键字x.keyi对存储在各子树中的关键字范围加以分割:如果ki 为任意一个存储在x.ci为根的子树中的关键字,那么 k1<=x.key1<=k2<=x.key2<=...<=x.keyx.n<=kx.n+1

4、每个叶节点具有相同的深度,即树的高度h。

5、每个节点所包含的关键字个数有上界和下界。用一个被称为B树的最小度数的固定整数t>=2来表示这些界。 
      a. 除了根节点以外的其他每个节点必须至少有t−1个关键字。因此除了根节点外每个内部节点至少有t个孩子。如果树非空,根  节点至少有一个关键字。 
      b. 每个结点至多包含2t-1个关键字。因此一个内部节点至多可有2t个孩子。当一个节点恰好有2t-1个关键字时,称该节点是满 的。 

那么B+树有什么性质呢:

根据上面的补充:

1、子树的个数与父节点的关键字个数相同

2、每个节点的关键字是子树的最大值或最小值的集合

3、内部节点不存卫星数据,卫星数据全部都在叶节点上。

4、所有的叶节点形成一个双向链表

分析一下上面的图:

###b+树的查找过程
如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

###b+树性质
1.索引字段要尽量的小:通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是t,则有h=㏒t(n+1)/2,当数据量N一定的情况下,t越大,h越小;而t = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。

2.索引的最左匹配特性(即从左往右匹配):当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

五、最后看看mysql连接数的配置,以及配置原则

这个是可以阅读一下这篇文章:https://www.jianshu.com/p/a8f653fc0c54

线程数 = (cpu*2)+ 有效磁盘数  所以最大和最小应该根据这个来 并设置一个等待队列 看tomcat使用的同步队列

一般情况下,队列的大小遵循下面的公式:

queSize <= ClientTimeOut(秒) * TPS

队列大小 小于等于 客户端超时 * 每秒处理的交易数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章