当我们看一本书时可以通过目录快速的定位到我们想要的章节 ,在数据库中查询数据也需要遍历表,而且数据库是把数据存储在硬盘上的,所以读取数据十分的慢,因此就可以给数据库引入索引,提高查询速度。
查看某个表是否有索引,有几个索引
语法:
show index from 表名;
注意:
create indext 索引名 on 表名(列名);
注意:创建索引是一个比较危险的操作,如果这个表中有大量的数据,创建索引时就会引发大量的硬盘 IO 很可能会把数据库卡死,造成大量损失
drop index 索引名 on 表名;
注意:与创建索引相同,删除索引是一个比较危险的操作,创建索引时,一定要在建表之初就规划好
B+树是一种自平衡的树形数据结构,它通常用于实现关系数据库中的索引。B+树的名称中的"B"代表"平衡",而"+"意味着它的所有叶子节点都被链接在一起,形成一个有序的链表。B+树的特点包括:
B+树由根节点、内部节点和叶子节点组成,其中根节点可以同时是内部节点和叶子节点。每个节点包含多个关键字和指向子节点的指针。
根节点:
内部节点:
叶子节点:
在数据库中,B+树主要用于索引的实现。数据库中的表可以根据某一列的数值大小构建B+树索引,从而加速对该列的查询操作。B+树索引的优点在于:
总的来说,B+树作为一种高效的自平衡树结构,在数据库系统中扮演着关键的角色,为快速的数据检索提供了重要的基础支持。
事务是一组被认为是单个逻辑工作单元的SQL操作,它们要么全部成功执行,要么全部不执行。事务可以包含一个或多个数据库操作(例如插入、更新、删除等),这些操作要么全部生效,要么全部回滚,以保证数据的一致性和完整性。
例如:转账的时候,银行先在卡里扣钱,然后再把钱转到另一张卡上,这是两个步骤,如果刚把卡里的钱扣了,然后数据库崩了,“把钱转到另一个卡上”这个语句还没执行,事务就是为了避免这类情况。
注意:回滚的原理是依赖日志,当事务执行一半,数据库崩了,前面已经执行的语句会被日志记录下来,然后进行回滚恢复。
MySQL支持多种事务隔离级别,用于控制并发事务之间的隔离程度。常见的隔离级别包括:
读未提交(Read Uncommitted):这是最低的隔离级别。在这个级别下,一个事务可以读取另一个事务尚未提交的数据。这意味着可能会出现脏读问题,因为一个事务可能会读取到另一个事务正在进行的修改,导致数据不一致 。
读已提交(Read Committed):这个级别确保了一个事务只能读取到其他事务已经提交的数据,从而避免了脏读的问题。在这个级别下,当一个事务正在修改数据时,其他事务不能读取到未提交的数据 。
可重复读(Repeatable Read):这个级别确保在同一个事务内多次读取同一数据时,结果是一致的。它通过在读取某行数据时加锁来实现,这样其他事务无法在此期间修改这一行数据,从而避免了不可重复读和幻读的问题 。
串行化(Serializable):这是最高的隔离级别。它通过强制事务串行执行来避免任何并发问题,确保了数据的一致性。然而,由于事务必须按顺序执行,这可能会导致性能下降 。
解释:
脏读(Dirty Read):这是事务隔离级别为“读未提交”时可能出现的问题。在一个事务读取数据的过程中,另一个事务也在对这部分数据进行修改,但第一个事务并不知道这一点。如果此时第一个事务读取了这部分数据,那么它读取到的将是尚未提交的、可能是错误的数据。这就是所谓的脏读。
重复读(Non-repeatable Read):这是事务隔离级别为“读已提交”时可能出现的问题。在一个事务多次读取同一行数据的过程中,另一个事务也对这部分数据进行了修改。如果此时第一个事务再次读取这一行数据,那么它将读到与第一次读取时不同的数据。这就是所谓的不可重复读。
幻读(Phantom Read):这是事务隔离级别为“可重复读”时可能出现的问题。在一个事务多次读取表中的数据的过程中,另一个事务插入了新的行。如果此时第一个事务再次读取表中的所有数据,那么它将看到一些原本不存在的行。这就是所谓的幻读。
在MySQL中,事务主要用于处理操作量大、复杂读较高的操作,例如插入、删除和更新多条数据。事务主要用来管理insert、delete、update语句。
举例来说,假设现在有一张仓库表,仓库表中记录了每一个物品的数量,还有一张用户表,用户购买产品时,仓库表的产品数量减少,而用户拥有产品的数量增加。但是如果仓库中的产品数量不足时,我们就需要用到事务来处理这种情况。
- start transaction;
- update 仓库表 set 产品数量 = 产品数量 - 1 where 产品ID = '1';
- update 用户表 set 拥有产品数量 = 拥有产品数量 + 1 where 用户ID = '1';
- commit;
在这个例子中,我们首先通过start transaction开始一个事务。然后,我们分别更新仓库表和用户表中的数据。如果两个更新操作都成功执行,那么我们就通过commit
提交事务,否则,我们可以通过rollback回滚事务。
这样,我们就可以确保数据的一致性和完整性。如果在执行过程中发生错误或者失败,我们可以回滚到事务开始之前的状态,避免数据的不一致。