静态网站提交表单怎么做,备案需要网站吗,长沙便宜网站建设,品牌传播方案很多同学面对Mysql索引相关的面试题都是死记硬背的#xff0c;这肯定是不行的#xff0c;也不容易记住#xff0c;所以大家还是要循循渐进#xff0c;从理解开始#xff0c;慢慢掌握#xff0c;当然对于想要准备面试题的同学#xff0c;这几个问题是需要记住并理解的这肯定是不行的也不容易记住所以大家还是要循循渐进从理解开始慢慢掌握当然对于想要准备面试题的同学这几个问题是需要记住并理解的 为什么要建立索引?
当在非常大的表中进行查询如果数据库进行全表遍历的话那么速度是会非常慢的而我们的索引则可以建立一个b树的结构可以自上而下的去进行查询(有点像二分查找)可以在一定程度避免走全表查询这样查询的速度是非常快的;
①一般情况下扫描索引的速度是远远大于扫描全表的速度的;
②索引是天然有序的具备B树的快速检索(类似二分查找)
③索引天然聚合(存储的数据是去重了的)在一些操作(分组排序等)中不会再产生中间表;
哪些情况适合建立索引?
对于查询占主要的应用来说索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的或者说没有添加更为有效的索引导致。如果不加索引的话那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描如果一张表的数据量很大而符合条件的结果又很少那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可比如性别可能就只有两个值建索引不仅没什么优势还会影响到更新速度这被称为过度索引。
那么哪些情况下适合建索引?
1. 频繁作为where条件语句查询的字段
这是因为在频繁查询的字段列创建索引可以避免查询数据的时候走全表扫描这样查询的速度就会大大增加;
2. 关联字段需要建立索引
关联的字段一般都是通过主键来进行两张表的关联主键大部分情况下都是主键;如果关联的两个主键都没有索引那么我们一般优先考虑在被驱动表中的字段建立索引因为在外连接的查询中被驱动表是需要被多次重复扫描的那么让它走索引查询是会快很多的可以避免更多次数的全表扫描;
3. 排序字段可以建立索引
这是因为b树结构的索引是天然有序的!
4.分组字段可以建立索引因为分组的前提是排序
5.统计字段可以建立索引例如count(),max()
这是因为索引是天然聚合的就是存放在b树的数据是已经去重的数据了存储的数据还是比较紧凑的那么通过B树的双向指针可以更快的找到要统计的数据而且在加了索引的列的统计的时候MySQL是不会产生中间表来专门去重了可以减少不必要的性能开销;(在没有索引的列的统计分组 的SQL语句中MySQL都是会创建临时表来存储数据的)
哪些情况下不适合建索引?
1.频繁更新的字段不适合建立索引 (因为数据比较大的表的索引的创建是非常耗时的而且如果一个字段被频繁更新那么我们还需要频繁的维护这个树的结构这个开销是非常大的)
2.参与列计算的列不适合建索引因为计算后的列的值最后不一定是有序的不有序那么就会导致索引会失效
3.表数据可以确定比较少的不需要建索引
4.数据重复且分布比较均匀的的字段不适合建索引因为说不定你对这种索引字段的查询的速度还没有全表扫描快例如性别真假值;
5.where条件中用不到的字段不适合建立索引因为索引是可以帮助我们在查询的时候大大的提高查询效率但是在增加删除操作确实异常消耗性能的因为需要不断的维护B树的结构(有序你就需要维护)你查询的时候都不需要使用到这个字段了那还建立这个字段的索引列干啥?等着吃你系统的性能嘛?
为什么索引是使用B树?(重点)
①因为b树是把数据都存放在叶子节点中的(在innodb存储引擎中一个b树的节点是 一页(16k))那么在固定大小的容量中 B树的非叶子节点中就可以存放更多的索引列数据也就意味着B树的非叶子节点存储的数据的范围就会更大那么树的层次就会更少IO次数也就会更少;
②b树的叶子节点维护了一个双向链表它更有利于范围查询
③b树中的叶子节点和非叶子节点的数据都是分开存储的分别存放在叶子节点段和非叶子节点段那么进行全表扫描的时候就可以不用再扫描非叶子节点的数据了并且这是一个顺序读取数据的过程(顺序读比随机读的速度要快很多很多)扫描的速度也会大大提高;
以上就是“大厂考核重点mysql索引面试题”你能回答上来吗?如果想要了解更多的Java面试题相关内容可以评论区留言或者私信博主分享。超多面试题可以加扣扣裙390144688下载。