MySQL笔记
文章平均质量分 83
笔仙笔仙
这个作者很懒,什么都没留下…
展开
-
45 | MySQL中主键自增id达到上限?xid也能达到上限?trx_id也也可以到上限?
1翻译 2021-08-26 14:21:08 · 839 阅读 · 1 评论 -
43 | 什么时候使用MySQL的分区表?(分区和分表是有区别的)
一、先干一碗鸡汤任何事情都是循序渐进的,无论自己有多期待一个好结果,都是急不来的,事压不垮人,但是情绪会压垮人。二、干巴得的内容2.1.分区表语法是什么?引擎中的存储结构是什么? CREATE TABLE `t` ( `ftime` datetime NOT NULL, `c` int(11) DEFAULT NULL, KEY (`ftime`)) ENGINE=InnoDB DEFAULT CHARSET=latin1PARTITION BY RANGE (YEAR(翻译 2021-08-14 09:27:32 · 420 阅读 · 0 评论 -
42 | MySQL Grant赋权限(这篇文章可能没啥你想要的)
本篇直接进入主题吧~1.MySQL赋权限有几个维度?分别是什么? 4个,全局、DB、表、列。 2.全局权限的语法是什么?原理是什么?生效时机是什么时候? grant all privileges on *.* to 'ua'@'%' with grant option; 1)磁盘上,将 mysql.user 表里,用户’ua’@’%'这一行的所有表示权限的字段的值都修改为‘Y’;2)内存里,从数组 acl_users 中找到这个用户对应的对象,将 access 值(权限位)修改翻译 2021-08-13 12:04:00 · 431 阅读 · 0 评论 -
41 | MySQL快速复制数据到一张表中(本篇躺平一下,了解即可)
一、前言现有表db1.t(1000行数据)和表 db2.tcreate database db1;use db1;create table t(id int primary key, a int, b int, index(a))engine=innodb;delimiter ;; create procedure idata() begin declare i int; set i=1; while(i<=1000)do insert .翻译 2021-08-08 21:33:33 · 956 阅读 · 0 评论 -
40 | insert...select语句中你不知道的锁问题
1翻译 2021-07-27 11:31:21 · 473 阅读 · 0 评论 -
39 | MySQL的id自增主键一定都是连续的?(写的不错~)
1翻译 2021-07-22 10:45:20 · 612 阅读 · 0 评论 -
38 | 何时使用除了Innodb以外的Memory引擎
一、前言这里的前言就是上篇评论二、内容翻译 2021-07-19 10:29:50 · 98 阅读 · 0 评论 -
37 | MySQL的内部临时表使用场景?(Group by语句使用注意事项)
1翻译 2021-07-14 10:32:19 · 700 阅读 · 0 评论 -
36 | MySQL中神奇的用户临时表怎么用?
一、前言你还在为“临时表”和“内存表”两个概念傻傻分不清?“临时表”到底有何妙用?今日说法记录精彩学习历程。二、内容2.1.内存表和临时表的区别是什么? 内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。 临时表,可以使用各种引擎类型 。如果是使用 InnoDB 引擎或者 MyISAM 引擎的临时表,写数据的时候是写到磁盘上的。 2.2.临时表有翻译 2021-07-08 09:48:06 · 193 阅读 · 0 评论 -
35 | 别再说不能使用Join了(这次是优化Join查询-下篇)
1翻译 2021-07-06 10:39:42 · 159 阅读 · 0 评论 -
34 | 别再说不能使用Join了(这是常识问题-上篇)
一、前言1.1.背景最近组内在推规范说不能使用Join,感觉有点以偏概全。更多的是合理使用Join,而不是盲目的Join。1.2.数据准备假设t1表结构为【id,a(索引),b】数据有100条,t2表结构有1000条数据。二、正文2.1.MySQL对于Join的算法有哪几类? Index Nested-Loop Join. Blocked Nested-Loop Join. 2.2.什么是驱动表?什么是被驱动表?如何选择驱动表、被驱动表?怎么让优化器按照指定的驱动翻译 2021-07-01 21:48:12 · 394 阅读 · 0 评论 -
33 | MySQL全表扫描会将内存打爆?(看了这篇你就赚)
一、前言本篇主要分析全表扫描对server层、引擎层的影响。二、全表扫描对server层的影响2.1.server端对结果集的保存流程是什么样的?MySQL 是“边读边发的”这个特性会存在什么问题?sending to data和sending to client的不同点是什么? 存在net_buffer(net_buffer_length=16k)中,直到 net_buffer 写满,调用网络接口通过send_socket_buffer发出去。如果发送成功,就清空 net_buffer,翻译 2021-06-30 21:23:49 · 584 阅读 · 0 评论 -
32 | 执行MySQL遇到kill不掉语句分析(此时你慌不慌)
一、前言前言就是本次无前言,好好学习吧~二、正文翻译 2021-06-25 00:27:02 · 1364 阅读 · 0 评论 -
31 | 误删MySQL DB数据怎么破?(这篇文章不一定能救你)
一、前言这篇文章就是普适性的一些思路,真要是不小心把库删了,还有一些补救措施。不过DBA们一般都还有一些高级货来快速止损。二、正文1.删除数据有哪四种情况? 使用 delete 语句误删数据行; 使用 drop table 或者 truncate table 语句误删数据表; 使用 drop database 语句误删数据库; 使用 rm 命令误删整个 MySQL 实例。 2.使用delete删除数据补救方式是什么?恢复数据过程中在主库还是从库执行,要求的翻译 2021-06-23 23:45:13 · 215 阅读 · 0 评论 -
30 | 再分析Innodb引擎的锁(看完这篇就可以拍肚皮了)
1翻译 2021-06-22 21:41:39 · 63 阅读 · 0 评论 -
29 | 如何判断一个数据库是不是出问题了?(研发也要懂运维呀)
11翻译 2021-06-05 18:50:26 · 149 阅读 · 0 评论 -
28 | MySQL读写分离之主从延迟解决方案(主从延迟问题有救了)
1翻译 2021-06-04 13:03:59 · 688 阅读 · 0 评论 -
27 | MySQL主从延迟分析以及HA保障(柯南版的后篇)
〇、前言前面笔记中的都是一主一备的结构,但是基本上我们的服务架构都是一主多从。为什么?因为大多是都是读多写少的业务翻译 2021-06-01 22:43:51 · 74 阅读 · 0 评论 -
26 | MySQL主从延迟分析以及HA保障(柯南版的中篇)
1翻译 2021-05-26 12:54:11 · 154 阅读 · 0 评论 -
25 | MySQL主从延迟分析以及HA保障(柯南版的前篇)
一、名词概念轰炸1.1.主从延迟(同步延迟)| 同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是“主库执行完一个事务写入binlog” 到 “备库执行完成这个事务” 之间的部分。二、正文2.1.如果想查看当前备库延迟了多少秒用什么命令?实现原理是什么? 执行show slave status命令的seconds_behind_master可以查看,单位为秒。 每个事务binlog中都有一个记录主库写入的时间字段,备库取出正在这个事务的的时间字段与当.翻译 2021-05-23 19:32:44 · 126 阅读 · 0 评论 -
24 | MySQL主备原理分析(吐血到键盘上才整理出来的笔记)
一、话不多说正文开始1.1.主备复制需要哪几个线程?每个线程作用是什么?架构图是什么样子的? mysql主从复制需要三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread) binlog dump线程:主库中有数据更新时,根据设置的binlog格式,将更新的事件类型写入到主库的binlog文件中,并创建log dump线程通知slave有数据更新。当I/O线程请求日志内容时,将此时的binlog名称和当前更新的位置同时传给s翻译 2021-05-20 21:10:23 · 273 阅读 · 0 评论 -
23 | MySQL性能提升(针对秒杀、大促时的优化)
一、前言本篇文章主要讲解了三个参数来提升性能 [真实有效,童叟无欺] ,即:MySQL 写入 binlog 和 redo log 的流程。二、正文开始????:1.sync_binlog参数 [上来先展示参数镇镇场子]此参数控制binlog的写入机制,binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 binlog cache(1.1讲解了),事务提交的时候,再把 binlog cache 写到 binlog 文件中(1.2讲解了),最后fsync到磁盘中。⚠️:1.翻译 2021-05-16 16:13:54 · 259 阅读 · 0 评论 -
22 | 如何让MySQL临时提升下性能
一、前言注意,文章中讲的方案皆是有损的,需要评估业务能否承受。二、正文场景1:短连接风暴,正常的短连接模式就是连接到数据库后,执行很少的 SQL 语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然暴涨的情况。PS:暴涨的危害是什么?连接的成本高,CPU资源都浪费在中括号中【除了正常的网络连接 三次握手 外,还需要做 登录权限判断 和获得这个 连接的数据读写权限】解决方案第一种方法:通过show processlist命令kill connection翻译 2021-05-13 22:56:09 · 69 阅读 · 0 评论 -
21 | update一行却锁了多行记录
一、头打掉都要记住的地方????:1.加锁规则。前提:RR隔离级别下,且版本5.x 系列 <=5.7.24,8.0 系列 <=8.0.13。加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。原则 2:查找过程中 访问到的对象才会加锁。优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。优化 2:索引上的等值查询,向翻译 2021-05-12 22:02:31 · 545 阅读 · 0 评论 -
20 | 搞清楚幻读本质(搞清楚什么读?搞什么幻读?什么清楚幻读)
一、上期问题再跟进现有SQL如下:CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);翻译 2021-05-08 00:06:29 · 340 阅读 · 0 评论 -
19 | 查一行SQL语句慢的原因分析
一、抛砖引玉warning:如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或 ioutil(IO 利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于我们今天的讨论范围。现有背景:构造一个表,这个表有两个字段 id 和 c,并且我在里面插入了 10 万行记录。mysql>CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,PRIMARY KEY (id))ENGINE=InnoDB翻译 2021-04-21 14:43:37 · 200 阅读 · 0 评论 -
18 | 在索引字段上加函数踩坑经验
一、条件字段上加函数操作背景:现有交易记录表 tradelog 包含交易流水号(tradeid)、交易员 id(operator)、交易时间(t_modified)等字段:mysql> CREATE TABLE `tradelog` ( `id` int(11) NOT NULL, `tradeid` varchar(32) DEFAULT NULL, `operator` int(11) DEFAULT NULL, `t_modified` datetime DEFAULT NU翻译 2021-04-13 11:03:57 · 659 阅读 · 0 评论 -
17 | order by排序时随机函数原理
1翻译 2021-04-12 00:45:38 · 688 阅读 · 0 评论 -
16 | order by原理
一、抛砖引玉现有表结构如下:CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`)) ENGINE=InnoDB;SQL如下:sele翻译 2021-03-29 22:15:36 · 290 阅读 · 0 评论 -
15-02 | 一个关于唯一索引的业务场景
一、抛砖引玉业务上有这样的需求,A、B 两个用户,如果互相关注,则成为好友。设计上是有两张表,一个是 like 表,一个是 friend 表,like 表有 user_id、liker_id 两个字段,我设置为复合唯一索引即 uk_user_id_liker_id。语句执行逻辑是这样的:分析:以 A 关注 B 为例:第一步,先查询对方有没有关注自己(B 有没有关注 A)select * from like where user_id = B and liker_id = A;如果有,则成为好友ins翻译 2021-03-26 15:58:22 · 302 阅读 · 0 评论 -
15-01 | redo log & binlog日志相关问题(看完后会让整个人清爽了)
问题1:我们从前面知道了MySQL是有两阶段提交的,那么在这两个阶段中发生crash,MySQL怎么保证数据完整性?两阶段如下:【执行器将要更新的数据调用引擎层接口写入到redo log后标记为prepare阶段(此时记为时刻1),然后告知server端执行器生成这个操作的binlog,并写binlog到磁盘(此时极为时刻2),紧接着执行器告知引擎层提交事务并且通知redo log将prepare改为commit】分为两阶段判定:如果在时刻 1 的地方,也就是写入 redo log 处于 pr翻译 2021-03-25 11:37:14 · 409 阅读 · 0 评论 -
14-01 | MySQL 幻读如何解决?
如何解决幻读问题?首先明确select … 和 select … for update 视为不相同的查询,前者是“快照读”,而后者是“当前读”。假设有如下结构的表和数据:CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5);翻译 2021-03-23 15:42:31 · 235 阅读 · 0 评论 -
14 | count(*)这么慢,我该怎么办?
一、抛砖引玉MySQL的count(*) 语句到底是怎样实现的,以及 MySQL 为什么会这么实现?二、正文开始????:1.这个问题回答之前需要从不同的数据库引擎分析MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;InnoDB 引擎它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。⚠️⚠️⚠️:你要是加了where条件MyISAM也懵逼,不会返回这么快????:2.为什么Innodb不把数字翻译 2021-03-23 15:24:52 · 148 阅读 · 0 评论 -
13 | 为什么表数据删掉一半,表文件大小不变?
111翻译 2021-03-22 17:04:16 · 235 阅读 · 0 评论 -
12 | 为什么我的MySQL会“抖”一下?
一、抛砖引玉一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。????:1.为什么抖呢?因为MySQL哪个时候可能在刷脏页(flush)。PS:这里就要提到一个概念了:脏页 && 干净页。二、正文开始????:2.什么是脏页?干净页?当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。????:3翻译 2021-03-20 23:49:22 · 66 阅读 · 0 评论 -
11 | 怎么给字符串字段加索引?
一、抛砖引玉1.如何在邮箱这样的字段上建立合理的索引?现有语句:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64), … )engine=innodb;mysql> select f1, f2 from SUser where email=‘xxx’;通过先前我们了解到,email 这个字段上没有索引,那么这个语句就只能做全表扫描。如果加索引也只支持前缀索引或者不加前缀默认包括整个字段值翻译 2021-03-19 10:51:37 · 190 阅读 · 0 评论 -
10-02 | MySQL为什么有时候会选错索引?
一、优化器的逻辑????:1.优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。那么影响执行代价的重要因素是什么?扫描行数。为什么呢?扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少。优化器还会结合是否使用临时表是否排序等因素进行综合判断????:2.什么是索引的区分度?什么是基数?什么命令能看到一个表索引的区分度?一个索引上不同的值的占比情况成为区分度。一个索引上不同的值的个数,我们称之为“基数”(cardinality)show ind翻译 2021-03-19 08:38:52 · 128 阅读 · 0 评论 -
10-01 | MySQL为什么有时候会选错索引?
一、引人入胜的问题不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?PS:如果这里回答没有遇见过,那也正常,毕竟刚看到这里我也没遇见过,打工人何必难为打工人~我们先来创建一个表,看如何复现这个问题,过程如下⬇️CREATE TABLE t (id int(11) NOT NULL,a int(11) DEFAULT NULL,b int(11) DEFAULT NULL,PRIMARY KEY (id),KEY a (a),翻译 2021-03-19 08:38:31 · 151 阅读 · 0 评论 -
01 | 基础架构:MySQL基本架构和查询语句的执行
⚠️:文章记叙的顺序和阅读顺序一致。???? 标示小知识点,需要记忆背的。????标记代表提醒。????标记代表了解一、做事的道理看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。基础篇:查询、修改、事务、索引、锁(全局锁、表锁、行锁)、事务隔离性。此时在想为什么事务隔离性不放在事务之后讲呢,猜测是因为事务隔离性需要了解完锁的机制才能更加深刻理解。此处感觉基础篇讲的较少,稍后自己在看下其他的博客。实践篇:真的更多在讲实际过程中遇到的问题,也是面试必备问题吧,就是翻译 2021-03-18 11:29:03 · 148 阅读 · 0 评论 -
02 | 日志系统:一条SQL更新语句是如何执行的?
一、吹牛逼????:MySQL 可以恢复到半个月内任意一秒的状态。PS:看到这里根据以往的记忆肯定是redo/undo日志 + binlog日志二、回顾用当前SQL【update T set c=c+1 where ID=2;】串联一遍上一节的内容流程第一步:客户端先通过连接管理器建立连接,主要是为了对客户端的连接进行管理以及权限的验证(其中连接主要是通过TCP协议建立长链接)。第二步:建立连接后不会进行缓存查询,因为更新操作会导致缓存失效(8.0之前)。第三步:分析器会对每一个关键词进行解析。第四翻译 2021-03-18 11:27:13 · 105 阅读 · 0 评论