# 数据库索引常识

数据库索引常识

  • 业务场景:当表中有大量的数据但是没有加任何索引,那么这时候去查询这张表的数据的时候,性能不是特别好,为了提高行能,可以优化查询Sql,在数据库层面的话可以做分库分表操作,可以做读写分离操作。对于单张表而言,可以适当的增加索引,加快查询速度。
索引是什么

​ 举个例子,你要找到学校中张三的信息那么最快的方法是,知道张三的班级、宿舍号、学号然后就可以很快的找到张三。类似于图书馆中查找书籍的操作。

​ 索引是对数据库表中一个或多个列的值进行排序的结构。

索引类型
哈希表

HashMap实现原理,哈希表里存的是(key-value)键值对,根据hash函数计算key的哈希值得到value存放的index。当不同的key拥有相同的hash值的时候,链表方式存储value的值。哈希表是无序的,所以做区间查询比较慢。

数组

​ 数组的长度是固定的,不能高效的实现动态索引的操作,所以适合数据量不变,适用于静态索引存储

二叉搜索树

​ 二叉搜索树的左子树的值都小于根节点,右子树的节点值都大于根节点。单从查询的角度来说二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树,而是选择使用多叉树,也就是B树、B+树这种每个节点可以有多个子节点的树。树越矮,查询过程中需要经过的树节点越少,需要时间也就越少。B+树优化了二叉搜索树,增加了宽度,加快查找速度。

Innodb
  • Mysql数据库的默认存储引擎
  • 支持事务安装
  • 灾难性恢复好
  • 使用行级锁
  • 实现缓冲处理:提供缓存池,缓存索引缓存数据。
  • 支持外键

​ 在Innodb中表中数据都是根据主键顺序以索引的形式存放。这种存储方式的表称为索引组织表。每一个索引对应一棵B+树。

索引实现原理(B树、Hash等)
B树
  • m阶的B树,每个节点至多有M棵子树。
  • 根节点至少有两棵子树。
  • 关键字分布在整棵树中,任何一个关键字只出现在一个节点中。
  • 搜索性能等价于在关键字内做一次二分查找。
B+树

​ B+树通常用于数据库和操作系统的文件系统中,B+树的特点是能够保持数据稳定有序。

  • 所有关键字都在叶子节点的链表中,链表中的关键字是有序的。
  • 不可能在非叶子节点找到。
  • 非叶子节点是节点的指针,数据存储在叶子节点的数据层。
数据库索引
  • 一个索引构建一棵树
创建索引优缺点

​ 优点:加快数据检索速度。

​ 缺点:创建索引和维护索引随着数据量的增加而增加,每个索引占用一定的物理空间,对表中的数据进行增加、删除和修改的时候,索引要动态的维护,降低了数据的维护速度。

怎样创建索引
  • 定义有主键或者外键的数据列建立索引。
  • 需要在指定范围内的快速或频繁查询的数据列。
  • 经常用在where子句中的数据列。
  • 使用order by、group by、dist 等查询的列。
  • 查询中很少涉及的列,重复值较多的列不要建立索引。
  • 对于经常存取的列避免建立索引。
索引匹配原则(最左匹配原则)
  • 例如:有联合索引(a,b,c)

    索引有效匹配到 (a) (a,b) (a,b,c)

索引失效
  • like查询 %开头:索引应该遵循最左匹配原则;
  • 复合索引未用左列字段;
  • 需要类型转换;
  • where 中索引列有运算;
  • where 中索引使用了函数;
  • 使用 !=或者<>查询;
  • 列的数据类型不一致;
  • Or查询引起索引失效;
  • NOT IN、NOT EXISTS 查询;
  • IS NULL不走索引 IS NOT NULL走索引
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值