目录
一、索引
1、索引
使用一定的数据结构,来保存索引字段(一列或多列)对应的数据,根据索引字段来检索(是否能够命中索引,是sql性能优化的关键),可以提高检索效率。
2、使用
创建主键约束、外键约束、唯一约束时,会自动创建对应列的索引。
- 创建索引
对于主键、外键、唯一约束之外的字段,可以创建普通索引
create index 索引名 on 表名(字段名);
- 删除索引
drop index 索引名 on 表名;
【注】创建索引时,需要保存其对应的数据(可能要花费大量的时间)。在更新/删除索引字段,以及插入数据时,都涉及到索引的更新。
3、分类
数据库保存数据的基本单位:page(数据的一行或多行)
目的:硬盘读取文件到内存的IO操作也是要耗时的,读取数据最好能最少次读取到需要的结果集。
MySql中,有多种索引分类:
- 从索引存储结构划分:B Tree索引、Hash索引、R Tree索引、FULLTEXT全文索引
- 从应用层次划分:普通索引、唯一索引、主键索引、复合索引
- 从索引键值类型划分:主键索引、辅助索引(二级索引)
- 从数据存储和索引键值逻辑关系划分:聚簇索引、非聚簇索引
(1)B和B+ Tree
区别:
- 数据存储的不同:B+树保存在叶子节点中,B树保存在所有的节点中。体现出B+树的优势:节点不存储打他,这样一个节点就能存储更多的key,使得树更矮,所以IO操作次数更少;查询性能稳定:每次查询都是从根节点到叶子节点,查寻路径长度相同,即每次查询效率相当。
- 叶子结点的指向:B+树相邻的叶子节点通过指针相连,B树没有。体现出B+树的优势:所有叶子节点形成有序链表,便于范围查找。
(2)聚簇索引和非聚簇索引
- 主键索引(聚簇索引):默认是B+树(一张表只能有一个主键索引)
B+树的叶子节点上,存放的是主键以及整条数据。
优点:速度快
缺点:主键主要是整型,且字段长度不能太大 ,更新代价大(效率低)
- 非聚簇索引(辅助索引):非主键约束都是。可以使用很多种类型的数据结构,如B+树、Hash索引等。
假如使用B+树:叶子节点存储的内容为(索引字段+主键值)。
此时搜索数据的方式为:
通过索引字段找到其相应的主键;再通过主键找到其所有数据(回表操作)(因为存在回表操作,意味着效率比主键操作低得多)
优点:更新代价相比聚簇索引小得多(叶子节点是索引值和主键值,没有实际数据)
缺点:也依赖有序数据;可能产生回表操作效率低。
- 覆盖索引:索引字段包含所有需要查询的字段。覆盖操作为非聚簇索引,此时不会产生回表操作。
特殊的一些操作,不会走索引:比如(is null和is not null)
(3)最左匹配原则
最左优先,联合索引中以最左边的索引为起点,任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)立即停止。
二、事务
1、事务的特性(ACID)
- 原子性:事务是最小的执行单位,不允许分割。事务的原子性保证动作要么全部完成,要么完全不起作用;
- 一致性:执行事务前后,数据保持一致,例如转账业务,无论事务是否成功,转账者和收款人的总额保持不变;
- 隔离性:并发访问数据库时,一个用户的事务不被其他的事务干扰,各并发事务之间数据库是独立的;
- 持久性:一个事务被提交后对数据库的改变是永久的。即使数据库发生故障也不能对其产生影响。
2、使用
(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
【注】rollback表示提交失败,commit表示提交成功
3、并发一致性问题
解决这些问题,使用隔离级别。
(1)丢失更新
T1和T2都提交,此时T1获取到的A的值为T2修改后A的值
(2)脏读
第一个事务修改了数据但是没有提交,在第二个事务读取了数据后,第一个事务发生了回滚,此时第二个事务读取到的数据就是脏数据。
(3)不可重复读
一个事务两次数据读取,在进行一次读取后,另一个事务对数据进行了修改,此时两次读取到的数据不相同。
(4)幻影读
一个事务两次读取,中间另一个事务进行了插入操作,导致两次读取到的数据不相同。
4、隔离级别
- 未提交读:事务中的修改,即使没有提交,对于其它事务也是可见的;
- 提交读:一个事务所做的修改再未进行提交前,对于其他事务是不可见的;
- 可重复读:保证同一事务多次读取同一个数据的结果是相同的;
- 可串行化:强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。该隔离级别需要加锁实现。要使用加锁机制保证同一时间只有一个事务执行,保证事务串行执行。
对于隔离级别,级别越高,安全性越高,对应的性能就越差。masql默认的隔离级别为可重复读。