数据库-索引
数据库三大范式
列的原子性--非主键列完全依赖于主键--且只依赖于主键
连接泄露--一样的就是留下没有关闭的连接无法使用
索引
优点-加快检索速度-唯一性索引可以保证数据唯一性-加速表表连接
缺点--创建维护需要时间空间
B树索引-平衡树索引
实际上都是B+树实现的
m阶B-Tree-每个节点最多m个子节点
除根节点和叶节点之外每个结点最少有m/2向上取整的子节点
叶子节点同一层,从小到大排列
B+ Tree优化了-
非叶节点只存关键字信息--具体数据在叶节点包含全部信息---叶子节点之间都有一个链指针
Hash索引
直接哈希
位图索引
针对比如性别,行政区这种固定值的,并且静态不更改的数据
直接001,010,110这样子赋值
B+ 树的优点-节点只存发键-同一内存页可以读取多个数据-因可以logn找到最小的节点通过链表遍历全数据
hash索引只能等值无法范围查询-不支持排序-无法支持模糊查询-
避免不了回表-B+树符合聚簇索引和覆盖索引的时候可以没有回表
hash碰撞多的话不稳定-B+树稳定查找
前缀索引-只使用长字符串的前缀进行索引-根据平均匹配度选择长度-
联合索引(多列索引)-- 遵循最左优先--where语句使用最频繁的放在左边
(a,b,c)索引-则有(a), (a.b),(a,b,c)
遇到>,<,between, like 就会停止匹配
where语句 ab c d可以换顺序
where b=1 and a=1没问题
where b =1 无法使用索引
添加索引原则--查询使用很少不加--数据值很少的不加比如性别-text\image\bit 数据很大不加--
修改性能远远大于检索性能的时候不加,因为需要频繁更新索引
定义外键的数据列必须有索引-避免全表查询
聚簇索引--是数据存储方式--数据存储与数据放在一起--
InnoDB 支持聚簇索引--非叶节点按主键顺序-叶子节点存放主键以及行记录
特点--更高检索效率--减少磁盘IO次数--一个表只能有一个聚簇索引--频繁使用排序的字段创建聚簇索引
决定物理存储结构--包含了所有的数据
非聚簇索引--也是B树结构,但是只存储指向数据行的指针
包括覆盖索引--包含select数据字段----索引数据放置节点中--防止回表操作
复合索引--包含多个where条件字段----联合索引---通过索引找到主键--然后可能需要回表
InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:
(1)如果表定义了主键,则PK就是聚集索引;
(2)如果表没有定义主键,则第一个非空唯一索引(not NULL unique)列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
回表查询,先定位主键值(非主键的索引列),再定位行记录(聚簇索引),它的性能较扫一遍索引树更低。
聚集索引(主键或第一个唯一索引)就不会回表,普通索引就会回表。
比如select name from table where name = "shenzhen"
这样name命中索引树,id也找到了,已经包含了需要select的信息,所以不需要回表
而select name, sex from 。。。 中的sex信息必须回表才可以找到
索引覆盖---常见的方法是:将被查询的字段,建立到联合索引里去。
事务
锁来实现事务,事务就是一组数据库操作命令-必须全部执行或者全部不执行--正确的状态转换
事务的状态主要有--活跃状态、主内存-缓冲区
部分提交--所做更改依然处于缓冲区--失败状态--中止状态--提交状态--一致状态
具有ACID--原子性(必须全部执行或者不执行)-一致性(一致状态)-隔离性(不干扰)--持久性--持久化到数据库
采用日志来保证原子性-一致性-持久性--根据日志记录来判断
锁机制----来实现隔离性--持有锁的事务才可以更新该数据
脏读--读取其他事务未提交的数据--只读取了一次
不可重复读-查询两次--数据被其他事务update
幻读----查询出/或者更新整个表的数据两次或者其他涉及到整个表的数据行两次,其他事务新增数据行导致还有数据未修改
丢失更新-----顺序修改一个数据,导致前面的更新丢失
4种隔离级别
读取未提交----能够读取未提交的数据-所有四种都无法隔离
读取已提交---可以避免脏读,提交才能读---
可重复读--避免脏读不可重复读丢失更新--以及无法在读的时候更新数据--那么也就不会有丢失更新
可串行化--所有的避免
MySQL默认是可重复读--也就是仅仅无法避免幻读,因此需要避免操作所有数据行得时候新增数据
串行化会就是逐次执行事务-牺牲了系统得并发性
锁
6种类型
共享锁(S)-他读锁--可以并大读取数据但是不能修改
可以多次加共享锁--
select .... lock in share mode
排他锁(X)--独占锁-写锁---增删改的时候禁止其他操作
select ... for update
其他无法任何操作
更新锁(U)--防止出现死锁--如果两个事务都是先读取再修改
这样子都加了S,因为两个都不释放,无法转换成X,所以死锁了
更新锁只分配给一个事务-修改的时候就会自动变成排他锁,否则就是共享锁
意向锁-架构锁--大容量更新锁--
读取未提交----不需要加锁
读取已提交--加S,语句执行结束后释放
可重复读---加共享锁--但是必须事务结束后才释放
可串行化---锁定所有的键直到提交
死锁--占用共享资源互斥-请求保持--独占不可剥夺-循环等待
解决死锁--并发尽量顺序访问表-一次锁定所有资源--升级锁定颗粒度比如表级锁
银行家算法--尝试分配---
#你觉得今年春招回暖了吗#