MySQL
文章平均质量分 75
JavaEdge.
关注并私信我,获取更多大厂求职经验。《编程严选网》创始人
展开
-
连接MySQL 8.0时报错caching_sha2_password解决方案
mysql jdbc的maven链接:http://mvnrepository.com/artifact/mysql/mysql-connector-java。直接在xx.pom修改版本号即可。原创 2023-08-27 15:57:57 · 2239 阅读 · 0 评论 -
MySQL普通索引加锁案例分析
看是不是降序 如果不是,因为4不在表里,所以加【3,5】的间隙锁,然后右端点又是等职查询,所以加【3,5)的间隙锁。普通索引1 3 5 7,查询更新4 会加什么锁?原创 2023-01-21 13:04:02 · 360 阅读 · 0 评论 -
订单数据越来越多,如何优化数据库性能?
对于订单这类具有时间属性的数据,会随时间累积,数据量越来越多,为了提升查询性能需要对数据进行拆分,首选的拆分方法是把旧数据归档到历史表中去。这种拆分方法能起到很好的效果,更重要的是对系统的改动小,升级成本低。在迁移历史数据过程中,如果可以停服,最快的方式是重建一张新的订单表,然后把三个月内的订单数据复制到新订单表中,再通过修改表名让新的订单表生效。如果只能在线迁移,那需要分批迭代删除历史订单数据,删除的时候注意控制删除节奏,避免给线上数据库造成太大压力。线上数据操作非常危险,在操作之前一定要做好数据备份。原创 2023-01-07 23:26:28 · 2928 阅读 · 0 评论 -
MySQL读写分离
随着系统的用户增长,当单个MySQL实例快要扛不住大量并发的时候,读写分离是首选的数据库扩容方案。读写分离的方案不需要对系统做太大的改动,就可以让系统支撑的并发提升几倍到十几倍。推荐你使用集成在应用内的读写分离组件方式来分离数据库读写请求,如果很难修改应用程序,也可以使用代理的方式来分离数据库读写请求。如果你的方案中部署了多个从库,推荐你用“HAProxy+Keepalived”来做这些从库的负载均衡和高可用,这个方案的好处是简单稳定而且足够灵活,不需要增加额外的服务器部署,便于维护并且不增加故障点。原创 2023-01-07 18:50:23 · 14193 阅读 · 13 评论 -
SQL如何在数据库中执行
一条SQL在数据库中执行,经过语法解析成AST,然后AST转换为逻辑执行计划,逻辑执行计划经优化后,转换为物理执行计划,再经物理执行计划优化后,按照优化后的物理执行计划执行完成数据的查询。数据库都由执行器和存储引擎执行器负责执行计算存储引擎负责保存数据。原创 2023-01-05 23:27:57 · 876 阅读 · 2 评论 -
MySQL的索引条件下推(index condition pushdown,ICP)
索引下推:不符合索引最左前缀原则,却还能利用复合索引的其他字段,减少回表次数。最左前缀可用于在索引中定位记录。那不符合最左前缀的部分,会怎样?在搜索索引树时,只能用 “张”,找到第一个满足条件记录ID3。总比全表扫好。然后判断其他条件。原创 2022-10-13 21:53:20 · 819 阅读 · 0 评论 -
MySQL语法查找非空(NULL)的元素
# 不会报错,但不会有可用数据返回select name from clase where address != null# 这才是正确的SQL!select name from clase where address IS NOT NULL原创 2022-05-05 15:41:05 · 2401 阅读 · 0 评论 -
不讲废话,全程硬核,处理结构化数据的终极解决方案
现代Java应用架构越来越强调数据存储和处理分离,以获得更好的可维护性、可扩展性以及可移植性,比如火热的微服务就是一种典型。这种架构通常要求业务逻辑要在Java程序中实现,而不是像传统应用架构中放在数据库中。应用中的业务逻辑大都会涉及结构化数据处理。数据库(SQL)中对这类任务有较丰富的支持,可以相对简易地实现业务逻辑。但Java却一直缺乏这类基础支持,导致用Java实现业务逻辑非常繁琐低效。结果,虽然架构上有各种优势,但开发效率却反而大幅下降了。如果我们在Java中也提供有一套完整的结构化数据处理和计原创 2022-04-26 11:14:28 · 3731 阅读 · 17 评论 -
千万级用户系统的SQL调优实战
1 案例引入某系统需要对特定的大量用户推送一些消息:促销活动让你办卡有个特价商品而首先要通过一些条件筛选出这些用户,而该过程很耗时!日活百万,注册用户千万,而且若还未分库分表,则该DB里的用户表可能就一张,单表就上千万的用户数据。对该运营系统筛选用户的SQL:SELECT id, name FROM users WHERE id IN ( SELECT user_id FROM users_extent_info # 查询最近登录过的用户 WHERE latest_l原创 2022-03-16 00:53:17 · 939 阅读 · 1 评论 -
synchronize偏向锁底层实现原理
1 偏向锁的意义无多线程竞争时,减少不必要的轻量级锁执行路径。大多数情况下,锁不仅不存在多线程竞争,而且总是由同一条线程去多次获得锁,为了让线程获得锁的性能代价更低而引入了偏向锁。偏向锁主要用来优化同一线程多次申请同一个锁的竞争,即当对象被当做同步锁并有一个线程抢到了锁时,则在Mark Word设置该线程的线程ID、是否偏向锁设置1、锁标志位设置01等信息,此时的Mark Word 存储的就是偏向锁状态信息。在:创建一个线程并在线程中执行循环监听的场景下或单线程操作一个线程安全集合时原创 2022-03-04 10:37:43 · 1385 阅读 · 1 评论 -
MySQL的普通索引和唯一索引到底什么区别?
1 概念区分普通索引 V.S 唯一索引普通索引可重复,唯一索引和主键一样不能重复。唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)主键 V.S 唯一索引主键保证DB的每一行都是唯一、不重复,比如身份证,学号等,不重复。唯一索引的作用跟主键一样。但在一张表里面只能有一个主键,不能为空,唯一索引可有多个。唯一索引可有一条记录为null。比如学生表:在学校,一般用学号做主键,身份证号作为唯一索引在教育局,原创 2022-03-01 23:57:39 · 1038 阅读 · 0 评论 -
为什么范围后索引会失效 存储引擎不能使用索引中范围条件右边的列
比如说有三个字段 a b c,建立复合索引a_b_c。此时叶子节点的数据排序后可能为(a=1 b=1 c=1) (a=1 b=2 c=1) (a=1 b=2 c=3)(a=2 b=2 c=3) (a=2 b=2 c=5) (a=2 b=5 c=1) (a=2 b=5 c=2)(a=3 b=0 c=1) (a=3 b=3 c=5) (a=3 b=8 c=6)查找select a,b,c from table where a = 2 and b = 5 and c = 2先根据a = 2找到第二原创 2022-02-21 01:26:11 · 1639 阅读 · 3 评论 -
阿里三面:MySQL回表的性能伤害有多大?
1 回表的性能消耗无论单列索引 or 联合索引,一个索引就对应一个独立的B+索引树,索引树节点仅包含:索引里的字段值主键值即使根据索引树按条件找到所需数据,也仅是索引里的几个字段的值和主键值,万一你搞个select *,那就还得其他字段,就需回表,根据主键到聚簇索引里找,聚簇索引的叶节点是数据页,找到数据页才能把一行数据所有字段值读出来。所以类似select * from table order by xx1,xx2,xx3得从联合索引的索引树里按序取出所有数据,接着对每条数据都走一个主原创 2022-02-20 15:15:19 · 1405 阅读 · 2 评论 -
一个表中索引的数量是不是越多越好?
往InnoDB表新增数据时,都会基于主键给自动建立聚簇索引。 随着我们不停的在表里插入数据,会不停的在数据页里插入数据。一个数据页放满后,就会分裂成多个数据页,这时就需要索引页去指向各个数据页。若数据页太多,那么索引页里里的数据页指针也就会太多了,索引页也必然会放满的,于是索引页也会分裂,再形成更上层的索引页。默认MySQL建立的聚簇索引都是基于主键的值来组织索引,聚簇索引的叶子节点都是数据页,里面放的就是插入的一行行完整数据。数据页/索引页里面的记录都是组成一个单向链表,按数据大小有序排列数据页原创 2022-02-19 20:40:15 · 2522 阅读 · 0 评论 -
新增数据时,MySQL索引树的自调整过程
刚开始你一个表建好后,就一个数据页,就是聚簇索引的一部分,而且还是空的。若你插入数据,就是直接往这数据页里插入,也没必要给他弄索引页:初始数据页就是个根页,每个数据页内部默认就有一个基于主键的页目录,所以根据主键查找都没问题,直接在这唯一一个数据页里根据页目录找。但随着表里数据越来越多,你的数据页满了,就要搞个新数据页,将你根页面里的数据都拷贝过去,同时再搞一个新的数据页,根据你的主键值的大小进行挪动,让两个新的数据页根据主键值排序,第二个数据页的主键值都大于第一个数据页的主键值:此时根页就升级为原创 2022-02-19 19:59:34 · 639 阅读 · 0 评论 -
MySQL二级索引的查询过程
聚簇索引就是innodb默认创建的基于主键的索引结构,而且表里的数据就是直接放在聚簇索引里,作为叶节点的数据页:基于主键的数据搜索:从聚簇索引的根节点开始进行二分查找,一路找到对应数据页,基于页目录就直接定位到主键目标数据。若想对其它字段建立索引,甚至是基于多个字段建立联合索引,此时索引结构又是咋样?假设对其他字段建立索引,如name、age之类,都是一样原理。比如你插入数据时:把完整数据插入聚簇索引的叶节点的数据页,同时维护好聚簇索引为你其他字段建立的索引,重新再建立一颗B+树比如你基于原创 2022-02-19 17:31:55 · 2250 阅读 · 3 评论 -
MySQL聚簇索引物理结构及主键查询过程
数据页分裂的过程,在你不停往表里灌入数据时,会搞出来一个个数据页,若你的主键非自增,他可能会有一个数据行挪动过程,保证你下一个数据页的主键值都大于上一个数据页的主键值。假设有多个数据页,然后根据主键查询数据,直接查询是不行的,因为不知道主键到底在哪若你要查id=4的数据,你咋知它在哪个数据页嘞?所以如果还是这样子,你就只能全表扫描,从第一个数据页开始,每个数据页都进入到页目录里查找主键,最坏情况下,所有数据页你都得扫描一遍,贼坑。对此,就得针对主键设计个索引,针对主键的索引实际上就是主键目录:把每个原创 2022-02-19 14:09:37 · 779 阅读 · 0 评论 -
更新数据时,MySQL的聚簇索引是如何变化的?
文章已收录在我的 GitHub 仓库,欢迎Star/fork:Java-Interview-Tutorial听说点赞、评论、收藏的人长得都很好看哦。搜索一个主键id对应的行,先去顶层的索引页88里通过二分查找,定位到你应该去下层哪个索引页里继续找。若现在定位到下层的索引页35,此时在索引页35里也有一些索引条目,分别都是下层各索引页(20、28、59)及他们里面最小的主键值,此时在索引页35的索引条目里继续二分查找,容易定位到,应该再到下层的索引页里找。可能从索引页35接着就找到下层的索引页.原创 2022-02-19 13:15:45 · 2249 阅读 · 0 评论 -
线上MySQL频繁抖动的性能优化实战
平时执行的更新语句,都是从磁盘上加载数据页到DB内存的缓存页,接着就直接更新内存里的缓存页,同时还更新对应的redo log写入一个buffer中。既然更新了BP里的缓存页,缓存页就会变成脏页,就得有时机把那脏页给刷到磁盘文件,脏页刷盘机制,是维护了一个LRU链表。后续若要加载磁盘文件的数据页到BP,但此时并无空闲缓存页,就得将部分脏缓存页刷入到磁盘,此时就会根据LRU刷盘。万一你执行查询,需查大量数据到缓存页,可能导致内存里大量脏页需淘汰刷盘,才能腾出足够内存执行这条查询SQL。这时可能发现突然莫名原创 2022-02-18 00:28:58 · 2482 阅读 · 2 评论 -
MySQL如何加锁避免并发事务导致的脏写?
多个事务同时并发更新一行数据时, 就有脏写问题。脏写绝对不允许,可依靠锁机制让多个事务更新一行数据的时候串行化,避免同时更新一行数据。有个事务要来更新一行数据,他会先看这行数据有没有人加锁?看到没人加锁,该事务就会创建一个锁,包含自己的trx_id和等待状态,然后把锁跟这行数据关联在一起。更新一行数据,必须将其所在数据页从磁盘文件读到缓存页才能更新,所以此时这行数据和关联的锁的数据结构,都在内存。因为事务A给那行数据加了锁,所以此时该数据被加锁。就不能再让别人访问了!此时事务B也想更新那行数据,就原创 2022-02-16 23:37:28 · 960 阅读 · 2 评论 -
线上MySQL不可用,报错数据库无法连接
ERROR 1040(HY000): Too many connections:DB连接池里已有太多连接,不能再和你建立新连接。数据库自己有个连接池,你的每个系统部署在机器时,那台机器上部署的系统实例/服务实例自己也有个连接池,你的系统每个连接Socket都对应DB连接池里的一个Socket连接,这就是TCP连接:当MySQL告诉你Too many connections,就是在传达它的连接池的连接已经满了,你这业务系统不能再和它建立新的连接。案例DB部署在64G内存大机器,而连接这台物理机的Jav原创 2022-02-08 22:35:02 · 1444 阅读 · 0 评论 -
MySQL日志顺序读写及数据文件随机读写原理
MySQL在实际工作时候的两种数据读写机制:对redo log、binlog这种日志进行的磁盘顺序读写对表空间的磁盘文件里的数据页进行的磁盘随机读写1 磁盘随机读MySQL执行增删改操作时,先从表空间的磁盘文件里读数据页出来, 这就是磁盘随机读。如下图有个磁盘文件,里面有很多数据页,可能需要在一个随机位置读取一个数据页到缓存,这就是磁盘随机读因你要读取的这个数据页,可能在磁盘的任一位置,所以你在读取磁盘里的数据页时,只能用随机读。磁盘随机读性能极差,所以不可能每次更新数据都磁盘随机读,而是原创 2022-02-07 21:24:59 · 2628 阅读 · 0 评论 -
MySQL的Buffer Pool线程安全吗?
1 访问Buffer Pool时需要加锁吗?对MySQL执行CRUD的第一步,就是利用BP里的缓存来更新或查询。假设MySQL同时接收到了多个请求,他自然会用多线程处理,那这多线程就可能会同时访问BP,即同时操作里面的缓存页,同时操作一个free链表、flush链表、lru链表。现在多线程来并发的访问这个BP,此时他们都是在访问内存里的一些共享数据结构,如缓存页、各种链表,必要加锁,然后让一个线程先完成一系列操作,比如说加载数据页到缓存页,更新free、lru链表,然后释放锁,接着下个线程再执行操作。原创 2022-02-05 17:03:34 · 2627 阅读 · 0 评论 -
Buffer Pool缓存页不够时,如何淘汰缓存?
Buffer Pool缓存页不够时,如何淘汰缓存?若BP缓存页不够了,咋办?执行CRUD都会将磁盘数据页加载到缓存页,那在加载数据到缓存页时,必然是要加载到空闲缓存页,所以必须要从free中找个空闲缓存页,然后把磁盘数据页加载到该空闲缓存页随着不断将磁盘数据页加载到空闲缓存页,free中的空闲缓存页会越来越少。最终耗尽free中的空闲缓存页。这时,还要加载数据页到一个空闲缓存页时,MySQL 该何去何从?若所有缓存页都有数据了,那就无法再从磁盘加载新数据页到缓存页了,则只能淘汰一些缓存页:把一个缓原创 2022-02-05 10:35:20 · 1079 阅读 · 1 评论 -
图解MySQL系列(4)-Buffer Pool中的free链表
1 MySQL如何初始化Buffer PoolBuffer Pool中有N多缓存页,每个缓存页还有个描述信息。DB启动后,按BP大小向os申请一块内存区域,作为BP的内存区域。当内存区域申请完后,DB按默认缓存页及对应描述信息快,在BP中划出一块块内存,当DB把BP划分完后:这时,BP中的一个个缓存页还都是空的,要等DB运行起来后,当我们要对数据执行CRUD操作时,才会把数据对应的页从磁盘文件里读取出来,放入BP中的缓存页。哪些缓存页空闲?DB运行后,肯定执行大量CRUD,就需不停的从磁盘上读取原创 2022-02-04 19:18:34 · 1906 阅读 · 0 评论 -
图解MySQL系列(2)-SQL实战研究InnoDB架构设计
SQL实战研究InnoDB架构设计update `user` set `name`='xxx' where `id`=1;业务系统通过一个数据库连接发给MySQL,经过SQL接口、解析器、优化器、执行器,解析SQL语句,生成执行计划,接着由执行器负责执行该计划,调用InnoDB的接口去实际执行。本文研究存储引擎的架构设计,探索存储引擎内部如何完成一条更新语句。InnoDB的内存结构:缓冲池InnoDB内部放在内存里的组件,缓冲池(Buffer Pool),会缓存很多数据, 以便之后查询时,若缓原创 2022-02-03 18:03:00 · 4025 阅读 · 11 评论 -
MySQL架构设计
系统只要能从数据库连接池获取到一个数据库连接,就能执行CRUD。可通过数据库连接将待执行SQL发给MySQL。大部分 crud boy只知道:执行insert语句后,在表里会多条数据执行update后,会更改表数据执行delete后,会删除表里数据执行select后,会查询表里数据出来要是SQL性能丢人,建几个索引解决…这应该是目前行业内很多工程师对数据库的一个认知,完全当他是个黑盒来建表及执行SQL。网络连接必须有线程处理假设数据库服务器的连接池中的某个连接,接收到一条SQL网络请原创 2022-02-02 22:30:58 · 6057 阅读 · 9 评论 -
Java业务系统是怎么和MySQL交互的?
很多crud boy眼中的数据库:但使用MySQL时,总会遇到各种烦人问题,什么偶尔死锁、性能丢人、各种异常报错。一般人都会Google博客,尝试解决问题,最后虽然是解决了问题,但可能也没搞懂背后原理。所以才需要精通MySQL底层原理,探索在解决MySQL各种问题时,如何凭借原理去快速分析、排查和解决问题。MySQL驱动有啥用?要在Java系统访问MySQL,得加个MySQL驱动依赖,才能和MySQL建立连接,然后执行CRUD:maven配置,这段maven配置中就引入了一个MySQL驱动。mys原创 2022-02-02 19:14:06 · 7312 阅读 · 15 评论 -
MySQL数据查询太多会OOM吗?
线上 MySQL 直接 Select 千万条的100G数据,服务器会裂开吗?假设对某100G表t执行全表扫描,把扫描结果保存在客户端:# 该语句无任何判断条件,所以全表扫描,查到的每行都可直接放到结果集,然后返给客户端mysql -h$host -P$port -u$user -p$pwd -e "select * from t" > $target_file那这“结果集”存在哪的?服务端其实无需保存一个完整结果集,实际上MySQL取、发数据流程如下:获取一行,写到net_buf原创 2021-06-08 00:09:53 · 3495 阅读 · 6 评论 -
MySQL的int (10) 和 int (11) 的区别
mysql 中整数数据类型不同类型的取值范围不同数据类型的默认显示宽度显示的宽度跟负号没有关系,它只在人工设置了 ZEROFILL 属性有效。一旦人工设置了 ZEROFILL 属性,MySQL 会自动设置 UNSIGNED 属性(即 ZEROFILL 不能存储负数)。那取值范围和显示宽度到底有什么关系呢?利用 tinyint 做了个实验,首先创建一张表如下mysql> desc test_integer;+-----------+------------+------+-----+--原创 2021-12-23 22:53:12 · 1289 阅读 · 0 评论 -
我是如何一步步让公司的MySQL支撑亿级流量的
根据相关云厂商Benchmark结果,4核8G机器运行MySQL 5.7,可支撑500 TPS、10000 QPS。若要准备双十一,必定会引发查询请求数剧增,这时如何做主从分离解决问题呢?主从读写分离大部分互联网业务都是读多写少,因此优先考虑DB如何支撑更高查询数,首先就需要区分读、写流量,这才方便针对读流量单独扩展,即主从读写分离。在一个大项目中,这也是一个应对DB突发读流量的有效方法。曾经 前端流量突增导致从库负载过高,DBA会优先做个从库扩容上去,这样对DB的读流量就会落到多个从库,每个从库原创 2021-08-20 17:11:30 · 5282 阅读 · 23 评论 -
大数据量性能优化之分页查询
刷帖子翻页需要分页查询,搜索商品也需分页查询。当遇到上千万、上亿数据量,怎么快速拉取全量数据呢?比如:大商家拉取每月千万级别的订单数量到自己独立的ISV做财务统计拥有百万千万粉丝的大v,给全部粉丝推送消息案例常见错误写法SELECT *FROM tablewhere kid = 1342 and type = 1order id asclimit 149420,20;典型的排序+分页查询:order by col limit N,OFFSET MMySQL 执行此类SQ原创 2021-06-26 23:18:30 · 5535 阅读 · 5 评论 -
【大厂技术内幕】字节跳动原来是这么做数据迁移的!
数据迁移目标能够描述项目数据迁移的方案了解hbase的特点能够熟悉数据迁移中的数据包装和转换能够完成文章数据的全量和增量迁移能够完成热点文章数据的迁移1 为什么需要自动同步因为MySQL保存着我们爬取的以及自建的数据,对于爬取的数据,数据量比较大,使用mysql 存储会影响mysql的性能,并且我们需要对数据进行流式计算,对数据进行各种统计,mysq满足不了我们的需求,我们就将mysql中的全量数据同步到HBASE中,由HBASE保存海量数据,mysql中的全量数据会定期进行删除。HB原创 2021-06-22 15:19:41 · 2923 阅读 · 8 评论 -
Mac下使用Clion调试MySQL版本5.7源码
环境macOS Catalinaclion2020.1首先从 GitHub 获取 mysql 源码,直接通过 git pull 拉取代码。切换到 5.7 分支。操作生成目录// 生成编译后安装目录及数据目录mkdir -p build_out/data编译cmake . -DWITH_DEBUG=1 \-DCMAKE_INSTALL_PREFIX=build_out \-DMYSQL_DATADIR=build_out/datamake && make in原创 2021-06-17 17:03:28 · 1282 阅读 · 3 评论 -
MySQL是怎么实现事务隔离的?
一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值又是什么呢?初始化只有两行的表:事务A、B、C的执行流程事务是何时启动的?begin/start transaction并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB表的语句,事务才真正启动。一致性视图是在执行第一个快照读语句时创建的start transaction with co原创 2021-06-15 22:45:19 · 1387 阅读 · 2 评论 -
线上MySQL的自增id用尽怎么办?
MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,但定义了表示这个数的字节长度,计算机存储就有上限。比如,无符号整型(unsigned int)是4个字节,上限就是2^32 - 1。那自增id用完,会怎么样?表定义自增值id表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变。mysql> create table t(id int unsigned auto_increment primary key) auto_increment=4294967295原创 2021-06-14 22:08:41 · 2709 阅读 · 7 评论 -
有了InnoDB,Memory存储引擎还有意义吗?
两个group by 语句都用了order by null,为什么使用内存临时表得到的语句结果里,0这个值在最后一行;而使用磁盘临时表得到的结果里,0这个值在第一行?内存表的数据组织结构示例表插入测试数据。分别查询mysql> select * -> from t1;+----+------+| id | c |+----+------+| 1 | 1 || 2 | 2 || 3 | 3 || 4 | 4 || 5 |原创 2021-06-10 23:33:35 · 981 阅读 · 1 评论 -
如何在MySQL高效的join3个表
对于下面这个三个表的join语句select * from t1 join t2 on(t1.a=t2.a) join t3 on (t2.b=t3.b) where t1.c>=X and t2.c>=Y and t3.c>=Z;若改写成straight_join,要怎么指定连接顺序,以及怎么给三个表创建索引?尽量使用BKA算法使用BKA,并非“先计算两个表join的结果,再跟第三个表join”,而是直接嵌套查询的。具体实现:在t1.c>=X、t2.c>=原创 2021-06-09 17:44:44 · 5225 阅读 · 4 评论 -
为何阿里不推荐MySQL使用join?
DBA禁用join若有两个大小不同的表做join,用哪个表做驱动表?今天这篇文章,我就先跟你说说join语句到底是怎么执行的,然后再来回答这两个问题。示例表:往表t2里插入了1000行数据在表t1里插入的是100行数据可见,两表都有一个主键索引id和一个索引aIndex Nested-Loop Joinselect *from t1 straight_join t2 on (t1.a = t2.a);若直接使用join语句,MySQL优化器可能会选择表t1或t2作为驱动表,.原创 2021-06-08 14:54:22 · 2350 阅读 · 4 评论 -
备库为什么会延迟好几个小时?
之前的文章谈到的事故原因,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。但若备库执行日志的速度持续低于主库生成日志的速度,那该延迟可能小时级别。而且对于一个压力持续较高的主库,备库可能永远都追不上主库节奏了。这就牵涉本文话题:备库并行复制能力。主备流程图图中两个黑色箭头:一个代表客户端写入主库并行度高于下一个另一个代表备库上sql_thread执行中转日志(relay log)主库上影响并发度的原因就是锁。由于InnoDB引擎原创 2021-06-07 17:57:03 · 1077 阅读 · 1 评论