数据库的索引
什么是索引?
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。mysql中的索引结构是基于B+树的。
为什么要使用B+树?
二叉树:
当为1,2,3,4,5,6的数据时候,需要依次遍历,想要查找为6时,就需要查找6次(io每次读取的数据量有限)。
红黑树(二叉排序树):
红黑树然后避免了二叉树这个缺点,但是当高度很高的时候,磁盘IO次数还是很多。
B树:
B树避免了红黑树的缺点,但是B树的非叶子节点是存放date指针,而磁盘一次IO读取的内容是有限的,如果data数据量过大,也需要更多的IO次数。
B+树:
B+树的非叶子节点不存放date指针,存放索引方向的数据项。因此一次IO读取的数据比B树多,他的数据是全部存放在叶子节点的,并且叶子节点之间用指针串起来,这样遍历速度非常快。
事务的隔离级别?
读未提交:
首先,需要知道的是,读 未提交,一个事务是能够读取到另一个事务还未提交的修改。所以就会造成脏读这种现象。例子:我收到短信老板给我发了12k的工资,老板发现多给我发了1w的工资,然后回滚,我就只收到2k的工资。这种现象就是脏读。
读已提交:
一个事务开始,只能读取到另一个事务已经提交的修改。但是会出现“不可重复读”这种现象,也就是2次读取会读取到不同的数据。例子:事务一:我准备用银行卡买个娃娃,此时卡里还有2k。事务二:这时我老婆同时也用这个银行卡买了衣服,这件衣服1k块钱。然后事务一开始扣钱了,发现钱不够了,娃娃需要2k块钱,因此扣款失败了。这种现象就是不可重复读。
了解一下幻读,幻读也是2次读取数据不一致,但是幻读侧重于新增,不可重复读侧重于删除修改。
可重复读:
这个是mysql的默认隔离级别,他是让一个事务读的时候,会保存一份快照,这样读取的数据不会被改变。其他的事务允许有修改操作。
但是会有幻读,
序列化:一步一步操作,非常耗性能。
=================================================================
InnoDB
1.InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键。
2.如果创建索引的键是其他字段,那也会给这个字段建立B+树,然后在这个的叶子节点找到对应的主键,在通过这个主键所建立的B+树(数据库自动帮你建的)找到对应的记录。这也叫回表
只有一个文件,索引和数据在一起
MyISAM
2个文件,索引和数据分开
索引的分类?
1.主键索引
主键(唯一且非空)是一种唯一性索引,但他必须制定为PRIMARY KEY,每个表只能有一个主键。
2.唯一索引
索引列的所有值都只能出现一次,即必须唯一,值可以为空。
3.普通索引
基本的索引类型,值可以为空,没有唯一性的限制。
4.全文索引
全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建
5.组合索引
多列值组成一个索引,专门用于组合搜索
memory用的是hash表
MyISAM和InnoDB的区别?
索引覆盖或者覆盖索引?
1:select * from table1 where name ="zhangsan"
2:select id from table1 where name = "zhangsan"
对于第一条sql,他需要走普通索引,然后走主键索引进行回表
对于第二条sql,他需要走普通索引,就已经拿到id了,不需要再走主键索引,这个过程叫做索引覆盖或者覆盖索引。
最左匹配原则?
给(name,age)创建了组合索引
select * from t1 where name = "zhangsan" 会
select * from t1 where name ="zhangsan" and age = 10 会
select * from t1 where age = 10 不会
select * from t1 where age=10 and name="zhangsan" 会,会自己进行调整
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix