目录
索引
索引是一种特殊的文件,使用一定的数据结构,来保存索引字段对应的数据。可以对表中的一列或多列创建索引,并指定索引的类型。
首先我们要知道数据库保存数据的基本单位:page
作用
- 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
- 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
- 索引对于提高数据库的性能有很大的帮助
使用场景
在创建索引时我们要考虑以下几点:
- 数据量较大,且经常对这些列进行条件查询。
- 该数据库表的插入操作,及对这些列的修改操作频率较低。
- 索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
索引的类型
从索引存储结构划分:B+树索引、Hash索引、FULLTEXT全文索引、R Tree索引
从应用层次划分:普通索引、唯一索引、主键索引、复合索引
从索引键值类型划分:主键索引、辅助索引(二级索引)
从数据存储和索引键值逻辑关系划分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)
B树和B+树
B树
所有节点都保存有索引列及数据
B+树
叶子节点保存有索引列和数据,非叶子节点只有索引字段,叶子节点全部相连,B+树的每一个节点,都是一个page。
区别
(1)数据的保存位置不同:B+树保存在叶子节点,B树保存在所有节点中
体现出B+树的优势:节点不存储数据,这样一个节点就可以存储更多的key。可以使得树更 矮,IO的操作次数更少。
(2)叶子节点的指向:B+树相邻的叶子节点通过指针相连,B树没有
体现出B+树的优势,所有叶子节点形成有序链表,便于范围查找
基于B+树的索引
1. 主键索引(聚簇索引)
2. 非聚簇索引
优化原则:
- 索引字段尽量不要有null的值,如果条件是字段is【not】null,!= 会走全表扫描。
- 频繁查询的字段建立索引:需要考虑最左匹配原则
- 频繁更新的字段,慎用索引(索引更新代价大),索引适用于读多写少的场景
使用
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
查看索引
show index from 表名;
创建索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index 索引名 on 表名(字段名);
删除索引
drop index 索引名 on 表名;
事务
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
事务的特性(ACID)
原子性:事务是最小是执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部不完成;
一致性:执行事务前后,数据保持一致,例如转账业务,无论事务是否成功,转账者和收款人的总额应该是不变的;
隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
持久性:一个事务被提交以后。他对数据库中数据的改变是持久的,即使数据库发生故障也不会堆其有任何影响。(事务提交后,数据会持久化到硬盘)
使用
- 开启事务:start transaction;
- 执行多条SQL语句
- 回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
事务可能产生的问题
丢失更新:事务1修改数据的操作,在事务2修改后就覆盖掉
脏读:第一个事务修改数据但没有提交,第二个事务就读取,在第一个事务回滚后,第二个事务读取的就是脏数据
不可重复读:一个事务两次读取数据,中间有另一个事务修改,第一个事务两次读取的数据就不同
幻读:一个事务两次读取,中间有另一个事务执行了插入操作,造成第一个事务看到不同的结果
解决:隔离级别
注:隔离级别越高,代表越安全,性能越差