MySQL
胡萝卜炒白萝卜
受益于开源,热爱开源,希望贡献于开源
展开
-
MySQL基本架构示意图
1.MySQL的基本架构示意图MySQL可以基本划分为Server层和存储引擎层两部分,其中Server层包含了连接器、缓存、分析器、优化器和执行器,存储引擎层包含各种存储引擎实现,最常见的有InnoDB、MyISAM和MEMORY。2.执行流程首先客户端与MySQL连接,这部分流程由连接器处理,它包括管理客户端与MySQL的连接之外还包括权限认证。当客户端与MySQL建立连接,MySQL会查询权限表该用户相关权限,存放在该连接绑定的session中,当权限修改时,不会影响已经建立的连接,直到原创 2021-04-10 12:16:29 · 4929 阅读 · 2 评论 -
SQL优化以及各类SQL执行计划情况(持续更新)
建表语句CREATE TABLE `t_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) COLLATE utf8mb4_bin NOT NULL, `email` varchar(255) COLLATE utf8mb4_bin NOT NULL, `phone` varchar(255) COLLATE utf8mb4_bin NOT NULL, `sex` varchar(原创 2021-03-13 14:48:51 · 4842 阅读 · 1 评论 -
MySql快照读和当前读
快照读:顾名思义,就是从当前状态复制一份快照出来,之后可以从快照里读取数据,但是并不是真正将整份数据复制的,而是利用了版本机制实现。简单select 不加锁的语句就是快照读。select * from t_user;select * from t_user where id = 1;当前读:全程在最新版本里读取数据。加锁的 select 语句,insert、update 和 delete 语句都是当前读。select * from t_user for update;selec原创 2021-03-06 10:19:44 · 1089 阅读 · 0 评论 -
生产经验,如何给已上线的表加索引
背景:生产上有一张核心的业务表 t_user,数据量已经到了亿级别。现在有个需求,需要给该表的 username 字段加索引。方案1:利用凌晨系统不活跃时间,进行索引创建。优点:简单方便缺点:创建索引会锁表,会阻塞业务的执行,数据量越多,创建索引的时间越久,当有些业务要求24小时不能中断的是不可以采用该方案的方案2:创建新表,创建索引,同步原有表数据至新表,修改业务代码,设置一个开关,当开关打开时,后续事务需要同时往新旧两张表同时插数据,保证最新数据两张表都有,然后将旧表重命名为历史表,新原创 2021-03-05 23:10:45 · 4488 阅读 · 2 评论 -
MySQL相关锁
底层锁Innodb引擎,有表锁、行锁和间隙锁(GAP),还有一种由 行锁 和 间隙锁(GAP)组成的 next-key 锁。案例1:使用主键确定对应的行,并且存在数据,加行锁;若无数据,则不加锁select * from t_user where id = 1 for update;案例2:使用非主键字段查找,并且该字段无索引,加表锁select * from t_user where username = 'aaa' for update;案例3:主键不明确,加表锁select * fr原创 2021-03-05 23:04:26 · 6268 阅读 · 0 评论 -
MySQL 的 Innodb 引擎在 REPEATABLE-READ(RR) 的事务隔离级别下,幻读问题记录
看过一些博客和文章,有的说 MySQL Innodb RR 级别下,解决了幻读问题,也有的说没有解决,也还有一些说解决了部分幻读问题,但是都没有想过实验去论证,据着严谨的我,特此实验一番记录一下实验前提:1.使用 SELECT @@tx_isolation 查询当前的事务隔离级别,确保是 REPEATABLE-READ2.执行以下表结构语句创建表CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user.原创 2021-03-05 23:00:42 · 15531 阅读 · 0 评论