mysql unique实现原理_MySQL 原理

mysql的三层架构

连接层:管理连接,认证鉴权

服务层:sql语句处理,调用接口

存储引擎层:存储数据和索引

mysql查询流程

1. 客户端select查询

2. mysql服务端:查询缓存

3. 解析器parser(词法分析,语法分析)

4. 预处理器 pre processor (语义分析)

5. 优化器 optimizer(执行路径成本计算,提供执行方案)

6. 执行计划(确定最优执行计划)(explain (format=json))set optimizer_track='enabled=on'

7. 执行器(按执行计划执行具体命令,调用存储引擎接口)

8. 进入插件式存储引擎,存储数据(数据不同的文件存储形式)

mysql更新过程

1. 事务开始,从内存(buffer pool)或磁盘(data file)中读取包含这条数据的数据页返回给server执行器

2. server的执行器修改数据页这一行数据为newValue

3. 记录oldValue到undo log

4. 记录newValue到rodo log

5. 调用存储引擎接口,记录数据页到buffer pool,修改目标为newValue

6. 事物提交

Mysql的存储引擎InnoDB使用的索引数据结构加强版多路平衡二叉树(B+ Tree)

特点:

只在叶子结点存储数据(在根节点/枝节点存储索引数据

叶子结点相互引用形成有序链表结构

关键字数=度数=路数

B+树的深度一般在1-3层可以满足千万级数据存储

优势:

扫库,扫表能力更强

磁盘深度更低,减少io读写

原因:一个page节点可以存储的关键字越多,一次io加载的索引越多,树的深度越低

排序能力更强

效率更加稳定

2. Hash索引

时间复杂度为O(1)

不适合范围查找、比较查找,适合等值查找(=、in)

根据索引值进行hash运算,映射一条记录存放地址

如果字段重复,存在Hash碰撞

索引的分类

普通索引:normal index

唯一索引:unique index唯一,(只有一条记录可以为空)

主键索引:primary index唯一,不为空

全文索引:full text index 全文匹配(检索搜索)用es更好

联合索引/复合索引:一次对多个字段加索引

聚集索引/聚簇索引:索引键值的逻辑顺序与表数据行的物理存储顺序是一致的

非聚集索引:二级索引

二级索引:二级索引的叶子结点是存的聚集索引的键值

索引使用原则与建议

索引的个数不要过多,占空间大

在离散度大列上建索引【列离散度越公式:select count(distinct(列名))/count(*) from 表名】

在用于where判断、order排序、join的on、group by字段上创建索引

联合索引最左匹配原则

不建议用无序的值作为索引(uuid,身份证)

复合索引把散列度高的值放在前面

尽量创建复合索引,而不是增加单列索引

过长的字段,建立前缀索引

方式1: key `pre_idx` (`字段`(6))

方式2: alter table 表名 add key(字段(5));

索引覆盖:

回表:先二级索引查询树下先找到主键索引的键值,再扫描主键索引树

如果查询只用到了索引列,那么不再扫描主键索引树,避免了回表,加快了查找

索引条件下推

只适用于二级索引,把过滤的过程放在了存储引擎层,不需要用到server层过滤

什么情况用不到索引

索引列上使用函数(replace\substra\concat\sum count avg)

索引列上使用 + - * /

字符串不加引号,出现隐式转换

like条件中带%

负向查询:not like 不能用到索引

!= (<>)和NOT IN在某些情况下可以

文件格式说明

.frm文件

任何一个表都有的文件

表结构元数据的定义的文件

innodb

索引与数据一起存放在.ibd文件

myisam

数据文件:.MYD

索引文件:.MYI

锁与事物的关系

锁是读一致性的解决方案

读一致性能够实现事务隔离

事务隔离就能够提供了事务隔离级别

事务隔离级别是事务的一大特性

锁的分类

共享锁/读锁/S锁:(行锁) shared locks

多个事务可共享一把锁,去只读数据

排他锁/写锁/X锁:(行锁)exclusive locks

不能与其他锁并存,只有获取了该锁的事务才能过进行读写

意向共享锁/读锁:(表锁):intention shared locks

意向排他性锁/写锁:(表锁):intention exclusive locks

(意向锁:是否能加锁的标志)

行锁与表锁的对比

innodb支持行锁

myisam不支持行锁

锁定粒度:表锁>行锁

加锁效率:表锁>行锁(需要找到行记录)

冲突概率:表锁>行锁

并发性能:表锁

保证一致性的方案

1. 加锁

2. 多版本并发控制(MVCC)

让普通的查询不需要加锁通过mvcc判断规则可以实现读一致性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值