面试题04 数据库索引的原理?创建索引的缺点是什么,什么情况索引失效?优化数据库的方法有哪些?

1. 数据库索引的原理?

我们使用mysql为例,mysql使用的是InnoDB作为默认引擎,什么是b+树呢?以下图为例,上面为根节点,下面为叶子节点,在b+树中,每个节点大小是固定的,节点中会存放键值,键值又分为主键值和非主键值,主键值就是我们创建表的时候的ID,它会把这个ID存放到叶子中用于二分查找,如果是非主键值的话就不是用这个二分查找,而是类似于我们的字段username这种作为索引,将这里面的值写到叶子当中,接下来,我们已主键的索引为例,一个表可以建立多个索引,默认它一定会一个索引,就是主键索引,这个索引在创建表的时候就创建好了,在我们写入数据的时候,会将这个索引从根节点开始给它分配它需要存在哪里。

我们可以看到叶子节点有三种颜色,不同颜色可以代表不同的数据类型,在我们的b+树的叶子节点上可以记录一整行的数据,这份完整数据是存储在聚簇索引上,也就是我们的默认的主键索引上。

那我们建立第二个索引的话那就不会记录完整的数据,而是只记录一个数据id,他是用到非聚簇索引,那如果他需要完整的数据的话,他就需要进行回表查询,就是我们拿着这一个的id去跑到聚簇索引里面去二分查找找一遍,这就是索引优化的一个点,所以我们尽量在索引中不要出现没有的字段,尽量使用覆盖索引,也就是你查找出来字段跟你索引的字段是保持一致的

总结的话就是

  1. 以mysql为例,默认引擎InnoDB使用了b+树实现索引,在索引查找时实现了log (n)的时间复杂度
  2. 聚族索引记录了主键id (完整数据),非聚索引的索引树中记录数据 (索引字段+主键)
  3. 在聚族索引的叶子节点中记录了完整的值,非聚簇索引的叶子节点记录的是主键以及索引字段,如果需要完整值的活需要回表操作,即使用主键去聚族索引中再次查找完整数据
  4. 索引的叶子节点以链表的形式存储,方便顺序查找和排序

2.创建索引的缺点是什么

首先,会占用空间,索引是存储在磁盘上缓存在内存中的,如果你创建的时候索引越多就会越占用空间

其次,更新时会级联更新索引,我们在更新数据的时候,索引里面的数据也会跟着更新,就当我们将一个数据更改时,我们需要通过索引定位到这个数据在哪,改完了之后,它要记日志和更新索引,所以在更新的时候如果索引比较多的话,也是会影响性能的

然后,高并发写影响性能,在高并发的情况下写入的时候,如果你没有索引的话,直接往一个b+树写入就好了,但是你有如果索引多的话,你就要再往索引里面写

说是索引的缺点,实际上更像是索引的代价,看你能不能接受这代价了

3.什么情况索引失效

LIKE以%开头索引失效

不等于(!=或者<>)索引失效

IS NOT NULL可能失效(不同版本和数据决定) IS NULL有效

1.计算、函数导致索引失效
2LIKE以%开头索引失效
3.不等于(!= 或者<>)索引失效
4.IS NOT NULL可能失效(不同版本和数据决定) IS NULL有效
5.类型转换导致索引失效
6.数据库优化器觉得不用索引更快的时候失效

4.优化数据库的方法有哪些?


1.硬件 主要在存储层优化
2.网络
3.操作系统调优
4.表结构设计优化
5.sql优化
6.减少函数使用
7.索引优化
8.大字段及全文检索优化
9.连接池优化
10.事务优化
11.数据库集群化
12.加入缓存
13,冷热存储
14.分库分表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值