MySQL45讲
文章平均质量分 52
深入了解MySQL底层
qq_40396568
这个作者很懒,什么都没留下…
展开
-
普通索引和唯一索引如何选择?
普通索引和唯一索引如何选择? 普通索引可重复,唯一索引不可重复 问题:大量插入数据慢,内存命中率低,考虑是不是唯一索引的问题? 问题:为什么不建议字段长的做主键(比如身份证)? 在主键索引上,叶子节点存储主键值,叶子节点占用空间越多,那么整个树的高度变大,从而导致磁盘io次数变多 为什么字段长的可以做普通索引/唯一索引 主键索引是经常使用的,普通索引仅针对某一列,相比而言肯定希望“公用”的树高更低 个人理解 普通索引和唯一索引的性能区别 change pool 缓..原创 2022-03-29 10:27:43 · 1636 阅读 · 0 评论 -
读提交和可重复读的底层原理?事务的隔离级别底层实现?
读提交和可重复读的底层原理?事务的隔离级别底层实现? 读提交和可重复是通过MVCC实现,串行化是通过锁实现 MVCC 补充知识 所谓的一致性读视图,在可重复读隔离级别下,是事务开启之后,第一个开始读语句开始执行所创建的快照(包含所有已提交的更改/数据),后续事务所有的读数据均从该时刻的快照中读取,而读提交隔离级别下是每次读的时候都会生成一致性读视图 一般没有显示开启事务【这里autocommit=1】,默认是执行 begin/start transaction,这种方式启动事务,一致性读视原创 2022-03-24 10:04:15 · 608 阅读 · 0 评论 -
行锁(锁住的是一行记录)
行锁(锁住的是一行记录) 并不是所有引擎都支持行锁,比如MyISAM,不支持行锁意味着只能使用表锁,同一时间一张表只能允许一个更新操作在执行 两阶段锁 事务A执行期间获得两个行记录锁,事务B在事务A未提交之前都会被阻塞。行锁在SQL语句执行时加上,在事务提交之后才会释放,不是说语句执行结束就会立刻释放,称之为两阶段锁协议 两阶段锁协议的作用? eg:顾客A账户在电影院B购买了一张电影票 需执行的SQL语句如下 账户A扣除金额 1 影院B增加金额 2原创 2022-03-24 09:52:31 · 1459 阅读 · 0 评论 -
全局锁和表级锁
MySQL的锁分类? 根据锁的范围分为全局锁、表级锁、行级锁 全局锁 MySQL提供了一个对整个数据库加读锁的操作,当需要做全库逻辑备份时使用,在备份过程中,数据库为只读状态 全局锁的问题 在主库备份,备份期间业务停摆,无法进行更新操作 在从库备份,备份期间不能执行主库过来的binlog,导致主从延迟 如果备份不加锁呢?比如用户使用会员余额买了一门课,首先用户课程表+1其次扣除用户余额,如果先备用余额表,那么出现不花钱买书的情况。反过来就会出现花钱没买到课程原创 2022-03-23 08:43:29 · 140 阅读 · 0 评论 -
深入浅出索引下
深入浅出索引(下) 什么是回表? eg:select * feom T where K=3 注T为表名,k列建立普通索引 执行过程,先到非主键索引K上找到 k=3的记录,再根据主键Id去主键索引找到对应的行记录。这个过程回到主键索引树查询的过程称之为回表 如果查询的数据仅在主键索引上存在,那么回表操作不可避免 什么是覆盖索引? 查询的数据在非主键索引上存在,不需要回表查询称之为索引覆盖? eg :select id from T where K=3 执行过原创 2022-03-23 08:40:50 · 118 阅读 · 0 评论 -
深入浅出索引(上)
索引是一种以数据库的一列或多列进行排序的数据结构 索引的出现是为了提高查询效率,索引就是树的目录,相当于数据库的目录 每碰到一个数据库要先关注它的数据模型,这样才能从理论上分析出数据库的应用场景 实现索引的三种主要方式 哈希索引 哈希表是一种以键值对存储的数据结构,查找效率高,对于哈希冲突的解决主要采用的还是链地址法 哈希表存储数据较快,同一条链上只需想后添加,缺点是数据无序,不适合做区间查询,适合做等值查询 (应用:mercached和其它NoSQL引擎) 有序数组 相比哈希索原创 2022-03-22 08:31:53 · 164 阅读 · 0 评论 -
MySQL事务隔离
事务隔离 MySQL是支持多引擎的系统,不是所有引擎都支持事务,比如MyISAM就不支持,这也是MyISAM被取代的原因之一 事务的ACID特性 原子性 一致性 隔离性 对于隔离性来说,隔离性越好效率越差 持久性 事务的标准隔离级别 读未提交 一个事务未提交,所做的变更能被别的事务看到 读已提交 一个事务提交之后,所做的变更才能被其它事务看到 可重复读 一个事务执行过程中,所读的数据总是跟这个事务在启动时看到的数据是一致原创 2022-03-22 08:29:08 · 1418 阅读 · 0 评论 -
一条SQL更新语句是怎么执行的?
一条SQL更新语句是怎么执行的? 与查询相同部分,客户端通过连接器与MySQL建立连接,接着与表相关的查询缓存会失效,分析器语法分析,优化器选择是否走索引,与查询不同,更新操作还涉及日志模块的操作 之后执行器拿到引擎给的行数据,数据更新至内存,同时写入redo log【prepare阶段】,执行器生成该操作的binlog,并将binlog写入磁盘,执行器调用提交事务接口,将刚刚写入的redo log改成commit 提交状态,更新完成【commit阶段】 Mysql中的WAL(write-ahead-原创 2022-03-21 10:00:40 · 157 阅读 · 0 评论 -
一条SQL查询语句是如何执行的?
一条SQL查询语句是如何执行的? 大体上MySQL分为Server层和存储引擎层 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大部分核心功能 存储引擎层负责数据的存储和提取,目前常用的存储引擎是InnoDB,是目前MySQL的默认存储引擎,建表时可以指定存储引擎 SQL语句的查询过程 首先通过连接器连接到数据库,经过三次握手的TCP连接过程之后,连接器会对账户密码进行认证,如果认证通过连接器就会到权限表查询账户所具有的权限,否则认证失败,连接器负原创 2022-03-21 09:59:37 · 921 阅读 · 0 评论