数据库索引常识
- 业务场景:当表中有大量的数据但是没有加任何索引,那么这时候去查询这张表的数据的时候,性能不是特别好,为了提高行能,可以优化查询
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走索引