
MySQL应用探究
文章平均质量分 91
MySQL应用问题探究,知其然而知其所以然
架构精进之路
「架构精进之路」公号作者
坚持原创总结、沉淀和分享,希望能带给大家一些引导和启发,坚信做难事者,必有所得!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
硬核干货!一文掌握MySQL核心日志:binlog 、redo log、undo log
hello,大家好,我是张张,「架构精进之路」公号作者。在MySQL 中我们经常会接触到三个核心日志,它们分别是:binlog、redo log、undo log。好多同学对于它们可能并不陌生,但是具体区分起来各自的功能用途以及实现原理,那可能认知就会比较模糊了,今天就跟大家一起,来清晰明了的介绍一下这些日志的核心思想和功能原理。1 binlog1.1 binlog 设计目标binlog 记录了对...原创 2025-01-15 11:56:37 · 958 阅读 · 0 评论 -
SQL性能优化详解,值得收藏
hello,大家好,我是张张,「架构精进之路」公号作者。很多朋友经常会遇到如下情况:在做数据统计分析时,分析两分钟,跑数两小时......Web开发时候,通常的性能瓶颈,主要出现在数据查询时候.......在使用SQL过程中不仅要关注数据结果,同样要注意SQL语句的执行效率。本文涉及三大部分:1、SQL介绍2、SQL优化方法3、SQL优化实例1、MySQL的基本架构1)MySQL的基础架构图左边...转载 2023-11-15 08:31:22 · 553 阅读 · 0 评论 -
MySQL查询,是 join性能好,还是in一下更快呢?
hello,大家好,我是张张,「架构精进之路」公号作者。一、表结构1、用户表2、订单表二、先来试少量数据的情况1、join2、分开查3、代码层面三、试下多一些数据的情况1、join2、分开3、代码层面三、试下多一些数据的情况1、join2、分开3、代码层面四、到底怎么才能更好参考资料先总结:数据量小的时候,用join更划算数据量大的时候,join的成本更高,但相对来说join的速度会更快数据量过大...转载 2023-12-01 08:02:09 · 537 阅读 · 0 评论 -
数据库表字段为何默认为 NOT NULL?
目前大部分的开发现状来说,我们都会把字段全部设置成 NOT NULL 并且给默认值的形式。最近在 Review 代码时候,仍然偶尔发现数据库字段很多没有设置 NOT NULL,为什么要设置成 NOT NULL 呢?来自「高性能MySQL」中有这样一段话:尽量避免NULL很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。通常情况下最...原创 2024-09-12 08:31:14 · 1394 阅读 · 0 评论 -
一张表到底建多少个索引才是合适呢?
上周的一天,到公司接了杯水刚刚坐稳,就看到 DBA就在群里@ 某个研发帅哥,说“你们表已经有10个索引了,怎么这次还要加呢?”关于索引,是数据库后台用来加快查询速度的强大工具,索引通过提供快速查找所需数据的方法来增强查询能力。但我们经常听到这样一句话:“索引是把双刃剑”。说明索引并不是越多越好,索引可以提高查询的效率,但会降低写数据的效率,有时不恰当的索引还会降低查询的效率。那我就在想:一张表到底...原创 2024-11-06 08:30:42 · 1387 阅读 · 0 评论 -
疑问:加密后的数据如何进行模糊查询?
我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。一、背景为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有:密码、手机号、电话号码、详细地址、银行卡号、信用卡验证码等信息,这些信息对加解密的要求也不一样,比如说密码我们需要加密存储,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用...转载 2024-08-07 08:30:39 · 258 阅读 · 2 评论 -
全面透彻,MySQL 正确的慢查询处理姿势
hello,大家好,我是张张,「架构精进之路」公号作者。发现的一些问题问题1在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路就是看看有没有用到索引,没有用到就试图加一个,实在不行就甩锅给这种情况是历史设计问题或者自行判定为用户特殊操作下触发的小概率事件,随即便申请豁免掉... 其实问题没有根本上解决。问题2还有就是网络上经常可以看到一些类似...原创 2024-05-28 08:30:09 · 910 阅读 · 0 评论 -
全面透彻,深刻理解 MySQL 索引
hello,大家好,我是张张,「架构精进之路」公号作者。对于 MySQL 索引,相信每位后端同学日常工作中经常会用到,但是对其索引原理,却可能未曾真正深入了解。B- 树和 B+ 树是 MySQL 索引使用的数据结构,对于索引优化和原理理解都非常重要,下面就揭开 B- 树和 B+ 树的神秘面纱,让大家在面试的时候碰到这个知识点一往无前,不再成为你前进的羁绊!本文主要内容:MySQL 查询耗时分析,抓...原创 2024-05-21 08:30:51 · 1034 阅读 · 0 评论 -
让 数据库 和 缓存 数据保持一致的三种策略
hello,大家好,我是张张,「架构精进之路」公号作者。一、背景目前随着缓存架构方案越来越成熟化,通常做法是引入「缓存」来提高读性能,架构模型就变成了这样:先来看一下什么时候创建缓存,前端请求的读操作先从缓存中查询数据,如果没有命中数据,则查询数据库,从数据库查询成功后,返回结果,同时更新缓存,方便下次操作。在数据不发生变更的情况下,这种方式没有问题,如果数据发生了更新操作,就必须要考虑如何操作缓...原创 2024-02-20 08:31:39 · 1202 阅读 · 0 评论 -
批量写库操作,如何优化?
hello,大家好,我是张张,「架构精进之路」公号作者。引言数据库插入操作的语句如下:insert into table values (a1, b1)涉及到SQL层和存储层,其中SQL层需要解析SQL语句,生成抽象语法树(AST),计算表达式等,存储层需要判断主键冲突,包括增量数据和基线数据上的主键冲突,如果是非重复主键,则将数据插入到增量数据中。上条插入语句只插入一行数据,称之为单条插入,相应...转载 2023-11-03 08:31:55 · 130 阅读 · 0 评论 -
MySQL与MongoDB,该如何做技术选型?
hello,大家好,我是张张,「架构精进之路」公号作者。引言一般情况下,会考虑到MySQL与MongoDB如何做技术选型的时候,你一定是遇到了类似于非结构化数据JSON的存取难题,否则大家都直接MySQL开始搞起了。为什么要关注MongoDB呢?下图是DB-Engines 2023年10月数据库的排名统计,可以看到MongoDB总排名在第5,在Nosql数据库中排名第1。既然要做技术选型,那就先要...原创 2023-10-31 18:30:39 · 547 阅读 · 0 评论 -
MySQL 索引常见问题汇总,一次性梳理
索引是存储引擎用于提高数据库表的访问速度的一种数据结构。如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进行匹配。当遇到范围查询(>、 2 and c = 3,那么a、b个字两段能用到索引,而c无法使用索引,因为b字段是范围查询,导致后面的字段无法使用索引。原创 2023-04-06 11:33:03 · 2719 阅读 · 0 评论 -
实习生疑问:为什么要在需要排序的字段上加索引呢?
hello,大家好,我是张张,「架构精进之路」公号作者。众所周知,为了避免全表扫描,条件句中增加了索引,性能上对比一目了然。组内实习生同学不禁疑问:为什么要在排序的字段上添加索引呢?排序有好多种算法来实现,在 MySQL 中经常会带上一个 limit,表示从排序后的结果集中取前 100 条,或者取第 n 条到第 m 条。要实现排序,我们需要先根据查询条件获取结果集,然后在内存中对这个结果集进行排序...原创 2023-02-23 08:30:43 · 862 阅读 · 0 评论 -
还傻傻分不清MySQL回表查询与索引覆盖?
hello,大家好,我是张张,「架构精进之路」公号作者。最近的工作中,遇到一个查询里用到主键索引与二级索引并存的问题情况,那对于这种情况,索引是如何高效执行的,是否会产生回表查询呢?等等,首先解释一下,什么是回表?回表定义:先索引扫描,再通过ID去取索引中未能提供的数据,即为回表。即先定位主键值,再定位行记录。1、两类索引为了更好地阐释这个问题,我们还是从索引来介绍吧。InnoDB 索引分为两大类...原创 2023-02-20 08:30:15 · 420 阅读 · 0 评论 -
硬核总结,一文掌握 binlog 、redo log、undo log
hello,大家好,我是张张,「架构精进之路」公号作者。在MySQL 中我们经常会接触到三个核心日志,它们分别是:binlog 、redo log、undo log。好多同学对于它们可能并不陌生,但是具体区分起来各自的功能用途以及实现原理,那可能认知就会比较模糊了,今天就跟大家一起,来清晰明了的介绍一下这些日志的核心思想和功能原理。1 binlog1.1 binlog设计目标binlog 记录了...原创 2022-12-07 08:30:46 · 2292 阅读 · 0 评论 -
是什么影响了MySQL索引B+树的高度?
hello,大家好,我是张张,「架构精进之路」公号作者。提到MySQL,想必大多后端同学都不会陌生,提到B+树,想必还是有很大部分都知道InnoDB引擎的索引实现,利用了B+树的数据结构。那InnoDB 的一棵B+树可以存放多少行数据?它又有多高呢?到底是哪些因素会对此造成影响呢,今天我们就来展开聊一下。1InnoDB引擎数据存储在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,...原创 2022-11-18 08:33:19 · 730 阅读 · 0 评论 -
MySQL数据文件被误删,如何进行恢复?
hello,大家好,我是张张,「架构精进之路」公号作者。在我们实际工作中,尤其在公司的测试环境下,经常会有多个业务方服务共用同一套服务器,部署自身MySQL环境。很不巧的是,会出现有MySQL数据文件被删除/误删除的情况发生。假如真的发生了,想想就很令人崩溃对不对?先别着急,今天来跟大家分享一个对于MySQL数据文件被误删除后尝试恢复的办法。一旦发生上述情况,同时实例数据未做备份,是否有机会进行数...原创 2022-11-24 08:33:31 · 585 阅读 · 0 评论 -
性能大PK count(*)、count(1)和count(列)
最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,说到以下内容:你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,用 count(1),这样比较快......难道 count(1) 的性能就比 count(*) 要好吗?印象中网上有些“XX 面试官”系列的网文也有过类似问题的讨论,......原创 2022-08-23 08:31:32 · 2261 阅读 · 0 评论 -
数据库范式与反范式设计,是一门艺术
正文共:2251字 3图预计阅读时间:6分钟前言在日常业务研发过程中,我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则,对于数据表的设计范式,我们特别容易忽略它的存在...原创 2020-12-27 16:30:58 · 1017 阅读 · 0 评论 -
如何做好高并发系统设计,我总结了三点
hello,大家好,我是张张,「架构精进之路」公号作者。大家在面试中是不是经常被问到一个问题:“如果你系统的流量增加 N 倍你要怎么重新设计你的系统?”这个高并发的问题可以从各个层面去解,...原创 2021-10-13 08:18:00 · 670 阅读 · 1 评论 -
表驱动法,逻辑控制优化利器
最近好多同学在开发过程中谈到设计表结构的一些idea,为了让大家少走一些弯路,今天就计划聊聊表驱动法吧~1、概念介绍表驱动法 是一种...原创 2022-01-11 08:28:00 · 657 阅读 · 0 评论 -
值得收藏,详解 MySQL 多版本并发控制实现原理
▲点击上方“架构精进之路”关注公众号回复“01”领取「程序员进阶大礼包」这是「架构精进之路」公众号的第73篇原创文章MySQL 中多版本并发控制(MVCC),是现代数据库引擎实现中常用的...原创 2021-07-17 09:03:00 · 433 阅读 · 0 评论 -
详解MySQL的主从同步实现方案
二、主从同步MySQL主从复制主要同步的是binlog日志,涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:1、如何实现主从一致?(1)主节点 binary log dump 线程当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送binlog的内容。在读取binlog中的操作时,此线程会对主节点上的binlog加锁,当读取完成,在发送给从节点之前,锁会被释放。(2原创 2021-06-19 20:02:57 · 3356 阅读 · 21 评论 -
用实例带你了解 MySQL 全局锁
MySQL 全局锁会申请一个全局的读锁,对整个库加锁。全局锁的一般使用场景是:全局逻辑备份。全局锁的实现方式有两种://第一种方法Flush tables with read lock(FTWRL)//第二种方法setglobalreadonly=true复制代码当数据库处于全局锁的状态时,其他线程的一下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(建表、索引变更、修改表结构等)和更新类事务的提交语句。释放全局锁unlock tables;复制...原创 2021-06-07 10:21:34 · 317 阅读 · 9 评论 -
《面试官:谈谈你对索引的认知》系列之磁盘I/O
写在前面前面两讲我们介绍了B-/+树的特性对比,数据库系统普遍采用B-/+树作为索引结构。《面试官:谈谈你对索引的认知》系列之B-树《面试官:谈谈你对索引的认知》系列之B+树这一节将结合计算机组成原理相关知识讨论B-/+树作为索引的理论基础。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。原创 2021-06-01 14:12:36 · 725 阅读 · 17 评论 -
《面试官:谈谈你对索引的认知》系列之B+树
写在前面前面一讲我们介绍了B-树的特性,以及与平衡二叉树的对比得出B-树这类数据结构的优势。《面试官:谈谈你对索引的认知》系列之B-树那B+树作为B树的一个升级版,那它又有哪些优势呢?本讲继续为大家揭开B+树的神秘面纱,让它不再成为你前进的羁绊!B+树 简介B+树是B-树的一个升级版,也是一种多路搜索树,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。从上图B-树的简化图,我们可以发现几个显著特点: 据只出现在叶子节点(非叶子节原创 2021-05-30 17:41:50 · 358 阅读 · 1 评论 -
《面试官:谈谈你对索引的认知》系列之B-树
写在前面对于MySQL索引,相信每位后端同学日常工作中经常会用到,但是对其索引原理,却可能未曾真正深入了解,导致在面试过程中,回答不出重点那就可能要与机会说byebye了。面试官:MySQL的索引实现是用什么数据结构?你:好像是B+树吧面试官:为什么要用B+树,而不是B-树?你:...面试官:用B+树实现索引结构,有什么好处?你:...B-树和B+树是MySQL索引使用的数据结构,对于索引优化和原理理解都非常重要,下面就揭开B-树和B+树的神秘面纱,让大家在面试的时候碰到原创 2021-05-30 17:38:36 · 275 阅读 · 16 评论 -
踩坑 MySQL 索引,看看你真的会用吗?
关于 MySQL 索引,对于研发同学,尤其是后端研发同学,一定不会陌生。我们工作中经常会用到 MySQL 数据库,就肯定会经常用到性能优化方面的设计和考量,常常用涉及到 MySQL 索引。...原创 2021-04-06 08:30:00 · 274 阅读 · 0 评论 -
关于MySQL varchar类型最大值,原来一直都理解错了
写在前面关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~背景描述最近同事在做技术方...原创 2020-09-25 19:26:00 · 1894 阅读 · 0 评论 -
隐秘的 MySQL 类型转换
近期工作中同事遇到的一个真实问题,稍作整理后分享给大家~1、问题开篇一张用户表 `users` ,其中字段 `phone` 添加了普通索引。CREATE TABLE users ( ...原创 2020-09-03 12:10:00 · 236 阅读 · 0 评论 -
MySQL explain 中的 rows 究竟是如何计算的?
今天同事在处理系统慢SQL时遇到几个疑惑的问题,简单描述如下~【背景铺垫】相关表:CREATE TABLE test_table ( id bigint(20) UNSIGNED N...原创 2020-08-05 08:30:00 · 3978 阅读 · 1 评论 -
MySQL慢查询(上):你知道为啥会慢么?
正文共:2487字 6图预计阅读时间:7分钟发现的一些问题问题1在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路就是看看有...原创 2021-01-05 20:43:52 · 352 阅读 · 0 评论 -
MySQL慢查询(中):正确的处理姿势,你get到了吗?
正文共:5156字 6图预计阅读时间:13分钟上篇回顾继上篇:MySQL慢查询(上):你知道为啥会慢么?在上一篇内容中,我们一起探索了这些内容:SQL执行过程查询SQL为什么会...原创 2021-01-07 13:00:00 · 180 阅读 · 0 评论 -
MySQL慢查询(下):问题解决,应用总结
正文共:2348字 7图预计阅读时间:6分钟上篇回顾继上两篇:MySQL慢查询(上):你知道为啥会慢么?MySQL慢查询(中):正确的处理姿势,你get到了吗?在以上两篇内容中,我...原创 2021-01-09 18:58:07 · 211 阅读 · 0 评论 -
一文讲懂表驱动法
什么是表驱动法?是一种编程模式,从表里查找信息而不使用逻辑语句(if 和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和...原创 2020-07-17 15:31:55 · 3093 阅读 · 1 评论 -
MySQL连接超时关闭问题解决
句。最常见的就是采集或者新旧数据转化。 SHOW VARIABLES LIKE '%timeout%’ 解决方案:在my.ini文件中添加或者修改以下两个变量:wait_timeout=2880000interactive_timeout = 2880000关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如:sql = "set interactive_timeout=24*3600原创 2016-12-20 14:19:43 · 136 阅读 · 0 评论 -
【转】MySQL innodb表自增主键问题
使用自增长属性的字段当主键性能更好,这里要说明下自增主键需要注意的几个事项。问题一:表锁 在MySQL5.1.22之前,InnoDB自增值是通过其本身的自增长计数器来获取值,该实现方式是通过表锁机制来完成的(AUTO-INC LOCKING)。锁不是在每次事务完成后释放,而是在完成对自增长值插入的SQL语句后释放,要等待其释放才能进行后续操作。比如说当表里有一个auto_increment字段的时候,innoDB会在内存里保存一个计数器用来记录auto_increment的值,当插入一个新原创 2016-03-18 09:51:44 · 174 阅读 · 0 评论 -
Mysql分库分表方案
所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。2. mysql proxy:amoeba做mysql集群,利用amoeba。从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。原创 2015-12-02 18:03:58 · 116 阅读 · 0 评论 -
MySQL死锁解决
,接口执行慢且过段时间后报500错误,细探究发现是sql执行时,MySQL Server报错,具体如下:Error: Lock wait timeout exceeded; try restarting transaction 数据一直不能执行完成,是由于MySQL的事务产生了死锁,直接重启MySQL服务可以解决,但对于生产环境而言,并不是好的选择。 利用如下sql,获取锁表事务信息:SELECT * FROM information_schema.innodb_trx2015-10-27 15:26:01 · 109 阅读 · 0 评论 -
Mysql选择主键
以下规则: 数据类型用 INT(bigint)类型Int类型在做比较运算时会获取更好的性能(cpu比较周期缩短)。Int类型是顺序排列的这样在索引中逻辑上相邻的数据就分布在磁盘相邻的地方(大大减少IO次数)要尽可能的避免使用字符串来做主键主键长度尽可能短。如果选用bigint做主键由于bigint做主键只占8个字节所以比较节约空间,同时查询性能也很好。字符串来做主键,myisam默认的情况下为字符串使用了压缩索引这使查找更加缓慢。2015-02-27 10:21:02 · 146 阅读 · 0 评论