每日三道面试题,通往自由的道路15——MySQL

281 阅读6分钟

茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!

愿你在未来的日子,保持热爱,奔赴山海!

每日三道面试题,成就更好自我

我们继续聊聊MySQL吧!

1. 你认识索引吗?讲下为什么使用它呢

索引是一种特殊文件,它包含着对数据表里所有记录的引用指针,而且它是要占据物理空间的。

索引也是一种数据结构,索引的实现通常使用B Tree树或者B+tree树。

为什么我们需要使用索引呢?讲个例子:

我们都知道新华华字典是由很多汉字组成的,而这些汉字就好比我们数据库表里面的数据,那么我们需要如何快速定位到这么厚的一本字典中具体的某个汉字在哪里呢?

当然,我们会首先翻看字典的目录,通过目录里面按照拼音或偏旁部首方式快速定位出一个小范围,之后再到小范围内查找到想要的数据,那么这里的字典目录就是索引

所以使用索引的好处有什么呢?

  1. 提高数据的检索速度,降低数据库IO成本:使用索引的意义就是通过缩小表中需要查询的记录的数目从而加快搜索的速度。
  2. 降低数据排序的成本,降低CPU消耗:索引之所以查的快,是因为先将数据排好序,若该字段正好需要排序,则正好降低了排序的成本。

当然它也有一些坏处,事物总有两面性,我们总得看到哪方面给我们带来的价值更高!

  1. 占用存储空间:索引实际上也是一张表,记录了主键与索引字段,一般以索引文件的形式存储在磁盘上。
  2. 降低更新表的速度:表的数据发生了变化,对应的索引也需要一起变更,从而减低的更新速度。否则索引失效。

那我们什么时候可以使用索引呢?

  1. 对于我们经常出现在where、order by等需要经常查询的字段,我们可以为其添加索引,增加效率。
  2. 索引适用于我们读多写少的场景,因为维护索引和存储索引都是需要消耗资源滴!

不错呀!知道你行,没想到这么行!

2. 那你知道索引的原理和怎么设计吗?

原理

索引都是用来快速的查找那些具有特定值的记录,如果没有索引,一般来说执行查询遍历整张表

索引的原理就是把无序的数据变成有序的查询:

  1. 把创建了索引列的内容进行排序
  2. 把排序的结果进行生成一个倒排表
  3. 在倒排表内容中加上数据地址连
  4. 在查询的时候,会通过倒排表的内容,取出数据地址连,从而拿到具体的数据

设计原则

索引的设计原则要基于查询更快,占用空间小。

  1. 对于频繁的出现在查询条件中即出现在where字句后,或者是连接字句指定的列这些字段可以加索引
  2. 可以使用短索引,对于一些长字符串我们需要建立索引的话,我们可以指定一个前缀长度,这样即可以节省索引空间,而且查询时排除掉不匹配的行,再检查其余行是否可能匹配即可。就是一个这种法
  3. 对于一些有外键的数据列是必须要建立索引的。

然后以下情况我们是不建议建立索引的,因为索引的创建也需要消耗空间大小,而且还需要维护索引。

  1. 对于一些表的基数较小,是没什么必要索引的。因为索引对于数据量大,查询的效率才会更快。
  2. 不要过度索引,对于一些不需要查询的字段,重复值多的字段,不能有效区分数据的字段不适合建立索引。
  3. 更新频繁的字段更不能建立字段。
  4. 尽量做扩展索引,比如在查询a,b字段时,a已经有索引了,可以修改为a,b的联合索引。
  5. 对于定义为text,image,bit的数据类型字段不要建立索引。

不错,既然知道索引知识,就顺着问一点呗!

3. 那你可以讲下索引的数据结构吗

索引的数据结构和具体的存储引擎实现有关,mysql默认存储引擎Innodb使用的默认索引是B+索引,对于mysql使用较多也有hash索引。对于Hash索引来说,如果单条查询较多的话,可以使用hash索引,速度最快。而其他大部分场景就适合选择B+Tree索引。

  1. B+Tree索引

    B+Tree是一个平衡的多叉树,从根节点到每个叶子节点的高度差不会超过1,而且同层级的节点有指针相互连接,所以对于有一些范围查询的话,适合使用B+Tree索引,可以利用双向指针进行快速的左右一定,效率比较高,而对于常规查询的话,从根节点到叶子结点的搜索效率基本相同,不会相差太多。

  2. Hash索引

    哈希索引就是通过哈希算法计算成哈希值,然后存储在哈希表中,如果是单条等值查询的话,效率最高,因为只用计算一次哈希算法得到对应的哈希值就可以找到了,但是如果重复值较多的话,可能还需要在后续的链表中进行逐个查询,直到查询到为止。

    对于范围查询的话,哈希算法非常不支持,因为它计算一次哈希算法,然后没办法快速的左右移动。

那我们应该如何做选择呢?

如果我们只是对于一次等值运算,我们可以使用Hash索引,其他情况我们最好使用B+Tree索引更为优选。

小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信搜索太子爷哪吒公众号私聊我,感谢各位大佬!