关系数据库管理系统(Relational Database Management System:RDBMS)
一、索引的理解
1.索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构
在RDBMS系统中,数据的索引是硬盘级别的(占用空间大)
2.索引结构
2.1 Hash--->哈希结构
通过key查找数组下标,定位数据位置--->时间复杂度O(1)
特点:等值匹配快,范围查询慢。
2.2 B+tree--->树结构
通过二分递归查找,自增ID导致链式结构
--->通过平衡二叉树优化查找,二叉树高度太高,单次数据量太少,IO交互量太大
--->通过多路平衡树(B树)优化查找,关键字=子节点-1,数据区在关键字中
--->加强版多路平衡树(B+树)优化查找,关键字左闭合,所有数据区在底层叶子节点,IO、排序、扫表能力增强,查询稳定,层数固定
》》》
3.数据库引擎
3.1myisam:db.frm、db.myd、db.myi
myi:存数索引,每个索引对应一个地址
myd:存数数据,每条数据对应一个地址
索引直接是平级的
3.2.innodb:db.frm、db.ibd(主键主导型)
主键索引:聚集索引,每个叶子节点包含数据区,即记录所有数据
辅助索引:叶子节点指向主键索引
4.使用原则
4.1列的离散型--->离散越高,效果越好
4.2最左匹配原则
4.3三星索引
①where后条件匹配的索引关键字列越多,扫描的数据将越少
②避免再次排序--->order by 最好满足索引标准
③尽可能运用到覆盖索引进行数据的扫描,减少回表IO操作
5.使用问题
6.1联合索引避免使用范围查找
6.2联合索引会匹配单列索引,因此不需要重复建单列索引
6.3范围大的时候in比or更高效--->in采用二分查找思路
6.4覆盖索引,即通过一次查表,无需回表就可返回数据,常用于返回id主键,联合索引拆分查询,即不需要拿到主键索引重新查询。
6.5尽量减少回表操作--->消耗资源,延长查询时间
二、事务的理解-Innodb
1.innodb支持事务--->ACID(原子性、一致性、隔离性、持久性)
2.事务解决的三大问题:脏读(update uncommit)、不可重复读(update、delete)、幻读(insert--->innod临键锁)
隔离级别:读未提交、 读已提交(脏读)、可重复读(脏读、不可重复读)、串行化(不存在并发,基本不用)
3.锁的理解:
3.1 innodb 表锁+行锁----> myisam 表锁
共享锁(读锁)-行锁 | 加锁:select....lock in share mode 解锁:commit/rollback |
排他锁(写锁)-行锁 | 自动:delete/update/insert 手动:select ...for update |
意向共享锁-表锁 | 提高加表锁的效率--->快速判断表内是否有锁 |
意向排他锁-表锁 | 提高加表锁的效率--->快速判断表内是否有锁 |
纪录锁 | 锁住一条记录 |
间隙锁 | 锁住一个区间 |
临键锁 | 左开右闭=间隙锁+记录锁 |
3.2 innodb行锁的依据是索引
①无指定索引,使用隐藏索引,直接表锁
②辅助索引找到主键索引,直接行锁
③主键索引,直接行锁