数据库相关

1.MySQL

1.join

•inner join:由执行器自行决定谁是驱动表,谁是被驱动表
•left join:左表是驱动表,右表是被驱动表
•right join:右表是驱动表,左表是被驱动表
•straight_join:固定左边为驱动表,右边为被驱动表

on的条件只对被驱动表生效,尽量使用小表驱动大表
过滤顺序 先on后where

2.索引

索引算法:
hash:查找快,但是不支持范围查找和顺序查找
B树/B+树:B树每个叶子节点相对独立,B+树叶子节点间有指针相连,B树所有节点都存放key和data,B+树只有叶子节点存放data和key,其他节点只有key,查询都是从根节点到叶子节点
MYISAM的B+树是非聚簇索引,data存放的是地址,需要根据地址读取数据
Inodb 主键索引是聚簇索引,辅助索引存放的是主键的值和列值
前缀索引:只适用于字符串类型,对文本前几个字符创建索引,可以用于uuid
最左匹配: 查询条件中存在和最左字段匹配的字段就会去过滤一批数据,知道联合索引全部匹配完成,当匹配到的字段使用了范围查询就停止继续匹配出现断点后续的字段不会使用索引,(a,b)的索引 如果b=1 order by a不使用索引 a=1 order by b使用索引

3.锁

innodb :

  1. 表锁: update或delete未命中唯一索引或者索引失效的时候会锁表
  2. 共享锁:in share mode,共享锁之间可以互相兼容,和排它锁不兼容
    排它锁:for update,和排它锁共享锁都不兼容,需要等待事务执行完毕释放锁
    innodb也可以显式的使用表锁
    意向锁:引擎自己维护
  3. 自增锁: 主键自增,使用分布式锁
    传统锁 每条insert都需要去获取锁,高并发条件下性能较差
    连续锁:能确定insert条数,不会去获取传统锁
    交叉模式:并发insert 使用轻量级的互斥锁,会在多个事务间的insert间切换获取自增值,在使用binlog进行主从同步的时候会导致数据不一致
  4. 行锁
    记录锁:锁定某条记录.对某条记录加入排它锁,触发条件:精准命中唯一索引
    间隙锁:为了防止幻读,范围查询,使用索引,未命中数据 RR级别下才会有,唯一索引和主键索引只会使用记录锁,使用二级索引会锁住当前记录相邻的两条记录和之间的范围
    临键锁: 记录锁+间隙锁,范围查询,使用二级索引,命中数据不连续
    当前读:
    如果查询没有命中索引,则退化为表锁;
    如果等值查询唯一索引且命中唯一一条记录,则退化为行锁;
    如果等值查询唯一索引且没有命中记录,则退化为临近结点的间隙锁;
    如果等值查询非唯一索引且没有命中记录,退化为临近结点的间隙锁(包括结点也被锁定);如果命中记录,则锁定所有命中行的临键锁,并同时锁定最大记录行下一个区间的间隙锁。
    如果范围查询唯一索引或查询非唯一索引且命中记录,则锁定所有命中行的临键锁 ,并同时锁定最大记录行下一个区间的间隙锁。
    如果范围查询索引且没有命中记录,退化为临近结点的间隙锁(包括结点也被锁定)。
  5. MVCC
    为了解决无锁下的幻读,通过快照读去解决

4.日志

数据是以页为单位,
binlog:逻辑日志,记录执行sql,三种格式
statement 原语句
row 包含具体值
mixed 混合
事务执行过程中,写入binlog缓存,事务提交后写入binlog
redolog: 重做日志,用于崩溃恢复,记录了在某个数据页上做的修改
存储表空间ID、页号、偏移量以及需要更新的值
在事务执行中不断写入redolog,但是处于准备阶段,写入binlog后才会提交,方便崩溃回滚或者恢复
undolog:记录原始数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值