[mysql] 数据库索引
2021/5/20 2:31:14
本文主要是介绍[mysql] 数据库索引,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
分类。
索引分为:
- 主键索引
一个列为设置为主键会默认创建一个主键索引。 - 唯一索引
严格来说主键索引是唯一索引的一种,这两个的区别是:主键索引不允许为null,唯一索引可以为null; - 单列索引
- 复合索引
或者分为:
-
聚集索引:聚集索引存储记录是物理上连续存在,聚集索引一个表只能有一个
-
非聚集索引:非聚集索引是逻辑上的连续,物理存储并不连续,非聚集索引一个表可以存在多个
最左前缀原则
复合索引遵从最左前缀原则,比如说一张学生表里面的联合索引如key 'age name sex'
A:select * from student where age = 16 and name = '小张'//走索引 B:select * from student where name = '小张' and sex = '男'//直接从name开始,不走索引 C:select * from student where name = '小张' and sex = '男' and age = 18//顺序不影响,走索引
有哪些例子不走索引呢?
表student中两个字段age,name加了索引
A:select * from student where 'name' like '王%' //like 查询是以%开头 B:select * from student where age + 8 = 18 //用索引列进行计算 C:select * from student where concat('name','哈') ='王哈哈' //对索引列用函数了 D:select * from student where age != 18 //一些关键字会导致索引失效,例如 or, != , not in,is null ,is not unll
详情可见博客
数据库索引为什么用B+树
- B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
- 由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况。比如数据库中select数据,不一定只选一条,很多时候会选多条,比如按照id排序后选10条。如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了
为什么不用hash:文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。参考
这篇关于[mysql] 数据库索引的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-25MySQL报错Duplicate entry '0' for key 'PRIMARY'
- 2024-05-29阿里 Canal 实时同步 MySQL 增量数据至 ClickHouse 数据库
- 2024-05-24在Linux下管理MySQL的大小写敏感性
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享