![](https://img-blog.csdnimg.cn/20200602001230540.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
MySQL
文章平均质量分 87
本专栏最大的特点就是实用,一切以实用为目的,适当讲解原理却不过于深入讲解原理,所有文章的目的就是要解决企业中遇到的常见性能问题。
码农架构
专注于系统架构、高可用、高性能、高并发类技术分享
展开
-
MySQL 表列数和行大小有哪些限制?
列数限制MySQL对每个表有4096列的硬限制,但是对于给定的表,有效最大值可能会更少。确切的列限制取决于几个因素:表的最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过该大小 个列的存储要求限制了给定最大行大小内的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素 存储引擎可能会施加其他限制表列计数的限制。例如, InnoDB每个表的限制为1017列 功能键部分被实现为隐藏的虚拟生成的存储列,因此表索引中的每个功能键部分都计入表的总列数限制。行大小限制原创 2021-04-20 16:39:42 · 3774 阅读 · 0 评论 -
MySQL什么时候才考虑分表分库?
前面写过一篇文章介绍分库分表会带来哪些棘手问题?但是如果在我们业务遇到瓶颈时候还是会采用分表分库的方案。1. 什么时候考虑切分?1.1 能不切分尽量不要切分并不是所有表都需要进行切分,主要还是看数据的增长速度。切分后会在某种程度上提升业务的复杂度,数据库除了承载数据的存储和查询外,协助业务更好的实现需求也是其重要工作之一。不到万不得已不用轻易使用分库分表这个大招,避免"过度设计"和"过早优化"。分库分表之前,不要为分而分,先尽力去做力所能及的事情,例如:升级硬件、升级网络、读写分离、索引优化原创 2021-03-19 13:27:19 · 1319 阅读 · 2 评论 -
MySQL要分表分库怎么进行数据切分?
数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分。1.垂直(纵向)切分垂直切分常见有垂直分库和垂直分表两种。1.1 垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行.原创 2021-03-16 16:01:42 · 367 阅读 · 2 评论 -
从MySQL源码看其网络IO模型
前言MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱)。而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起。于是,便有了本篇博客。MySQL启动Socket监听看源码,首先就需要找到其入口点,mysqld的入口点为mysqld_main,跳过了各种配置文件的加载 之后,我们来到了network_init初始化网络环节,如下图所示:下面是其调用栈:mysqld_main (MySQL Server Entry Point) |-net原创 2020-11-14 18:01:50 · 306 阅读 · 5 评论 -
MySQL中悲观锁和乐观锁到底是什么?
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的按照锁颗粒对锁进行划分?锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁、页锁和表锁。 行锁就是按照行的粒度对数据进行锁定。锁定力度小,发生锁冲突概率低,可以实现的并发度高,但是对于锁的开销比较大,加锁会比较慢,容易出现死锁情况。 页锁就是在页的粒度上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录。当我们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页.原创 2020-11-11 23:31:26 · 326 阅读 · 1 评论 -
SQL是如何在数据库中执行的?
对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知道为什么要遵循这些规则,也就谈不上灵活运用。数据库的服务端,可以划分为执行器(Execution Engine) 和存储引擎(Storage Engine) 两部分。执行器负责解析 SQL 执行查询 存储引擎负责保存数据。SQL是如何在执行器中执行的 ?我们通过一个例子来看一下,执行器是如何来解析执行一条 SQL 的。这个 SQL..原创 2020-11-10 23:38:31 · 438 阅读 · 1 评论 -
MySQL:分库分表与分区的区别和思考
一.分分合合 说过很多次,不要拘泥于某一个技术的一点,技术是相通的。重要的是编程思想,思想是最重要的。当数据量大的时候,需要具有分的思想去细化粒度。当数据量太碎片的时候,需要具有合的思想来粗化粒度。1.1 分 很多技术都运用了分的编程思想,这里来举几个例子,这些都是分的思想集中式服务发展到分布式服务 从Collections.synchronizedMap(x)到1.7ConcurrentHashMap再到1.8ConcurrentHashMap,细化锁的粒度的同时依旧保证线程安全原创 2020-10-12 17:47:04 · 360 阅读 · 2 评论 -
一次SQL查询优化原理分析(900W+数据,从17s到300ms)
有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms),按照下文的方式调整SQL后,耗时347 ms (execution: 163 ms, fetching: 184 ms);操作:查询条件放到子查询中,子查询只查主键ID,然后使用子查询中确定的主键关联查询其他的属性字段;原理:减少回表操作;--优化前SQLSELECT各种字...原创 2020-10-12 17:44:23 · 184 阅读 · 1 评论 -
MySQL性能优化:互联网公司常用分库分表方案汇总
一、数据库瓶颈不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。1、IO瓶颈第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。2、CPU瓶颈第一种:SQL问题,如SQL中原创 2020-10-12 17:34:17 · 178 阅读 · 0 评论 -
数据库事务:理解事务的4种隔离级别
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。Read uncommitted读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但原创 2020-09-17 13:49:08 · 668 阅读 · 0 评论 -
如何使用性能分析工具定位SQL执行慢的原因?
我们都知道查询优化器,知道在查询优化器中会经历逻辑查询优化和物理查询优化。需要注意的是,查询优化器只能在已经确定的情况下(SQL 语句、索引设计、缓冲池大小、查询优化器参数等已知的情况)决定最优的查询执行计划但实际上 SQL 执行起来可能还是很慢,那么到底从哪里定位 SQL 查询慢的问题呢?是索引设计的问题?服务器参数配置的问题?还是需要增加缓存的问题呢?性能分析来入手分析,定位导致 SQL 执行慢的原因。前面已经更新了总结核心的主要三点 如何使用慢查询日志查找执行慢的 SQL 语..原创 2020-09-14 21:26:43 · 595 阅读 · 0 评论 -
MySQL怎么查看 SQL 的具体执行成本?
前面文章中逐步分析 如何使用慢查询快速定位执行慢的 SQL? 如何使用 EXPLAIN 精准查看执行计划? 其实最终的目的只有一个:如何使用性能分析工具定位SQL执行慢的原因?本篇主要是通过如何使用 SHOW PROFILE 查看 SQL 的具体执行成本SHOW PROFILE 相比 EXPLAIN 能看到更进一步的执行解析,包括 SQL 都做了什么、所花费的时间等。默认情况下,profiling 是关闭的,我们可以在会话级别开启这个功能。mysql >...原创 2020-09-12 00:12:12 · 558 阅读 · 0 评论 -
数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
MySQL 的复制主要是通过 Binlog 来完成的,Binlog 记录了数据库更新的事件,从库 I/O 线程会向主库发送 Binlog 更新的请求,同时主库二进制转储线程会发送 Binlog 给从库作为中继日志进行保存,然后从库会通过中继日志重放,完成数据库的同步更新,看来是一套完美的的灾备方案!但是有没有经历过“手抖”后的“绝望”。嗯!你志哥以前干过直接在生产环境中对数据进行操作,或者忘记了当前是在开发环境,还是在生产环境中,就直接对数据库进行操作。当然如果我们对数据库做过时间点...原创 2020-09-06 16:43:16 · 2971 阅读 · 0 评论 -
云原生下,如何实现高可用的MySQL?
云时代的到来,无论传统行业还是互联网行业,业务越来越多样,迭代速度越来越快,使得整体数据量大幅提升。近两年,随着 Docker + Kubernetes 等技术的兴起,大家都将业务往容器化迁移,团队的技术也在往云原生方向演进。早期的 Kubernetes 着重解决 Stateless 和 Share Nothing 的应用部署场景,然而在如今愈发复杂的应用场景中经常会遇到有状态保存的需求。从 Kubernetes 1.9 开始,针对有状态服务的资源类型 Statefulset 进入 GA,而且 Ku原创 2020-09-01 13:26:52 · 369 阅读 · 0 评论 -
看着都头大,MySQL为什么还有kill不掉的语句?
在 MySQL 中有两个 kill 命令:一个是 kill query + 线程 id,表示终止这个线程中正在执行的语句;一个是 kill connection + 线程 id,这里 connection 可缺省,表示断开这个线程的连接,当然如果这个线程有语句正在执行,也是要先停止正在执行的语句的。不知道你在使用 MySQL 的时候,有没有遇到过这样的现象:使用了 kill 命令,却没能断开这个连接。再执行 show processlist 命令,看到这条语句的 Command 列显示的是 Killed原创 2020-08-19 02:22:50 · 925 阅读 · 0 评论 -
MySQL索引背后的数据结构及算法原理你真的懂么?
摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。第二部分结合MySQL数据库中MyIS原创 2020-08-17 01:28:39 · 242 阅读 · 0 评论 -
MySQL I为什么用innoDB选择什么列作为主键?
MySQL是被广泛应用的数据库,InnoDB又是用得最广的存储引擎,主键又是对InnoDB性能影响最大的因素之一,主键选择对,可以极大提升性能。InnoDB选择什么列作为主键,有一些最佳实践:(1)不能为空的列;(2)不能重复的列;(3)很少改变的列;画外音:行是按照聚集索引物理排序的,如果主键频繁改变,物理顺序会改变,性能会急剧降低。(4)经常被检索(where key=XXX)的列画外音:被检索的列上要建立索引,如果该索引是聚集索引,能够避免回表,性能提升几乎一倍。.原创 2020-08-14 02:45:31 · 297 阅读 · 0 评论 -
MySQL性能优化(三):索引优化
索引原理如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开始查找,一直找到最后一页(如果要找的字在最后一页),这个过程非常耗时,这种场景相当于数据库中的全表扫描的概念,也就是循环表中的每一条记录看看该记录是否满足条件,扫描次数为表的总记录数。新华字典中都会有目录都有查找方法(比如按拼音查找、按部首查找),假如按拼音查找,我们根据拼音就能瞬速定位到要找的汉字,而这个汉字后面还有这个汉字对应的页数,我们直接翻到该页就能找到,整个查找过程非常快,用时非常短。这个原理就是数据库中索引的原理。这原创 2020-08-13 20:41:34 · 213 阅读 · 0 评论 -
查询请求增加时,如何做主从分离?
依据一些云厂商的 Benchmark 的结果,在 4 核 8G 的机器上运行 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS。这时,运营负责人说正在准备双十一活动,并且公司层面会继续投入资金在全渠道进行推广,这无疑会引发查询量骤然增加的问题。那么当查询请求增加时,应该如何做主从分离来解决问题。主从读写分离其实,大部分系统的访问模型是读多写少,读写请求量的差距可能达到几个数量级。这很好理解,刷朋友圈的请求量肯定比发朋友圈的量大,淘宝上一个商品的浏览量也肯定远大原创 2020-08-13 20:24:38 · 276 阅读 · 0 评论 -
MySQL索引-B+树、聚集索引和二级索引的结构分析
索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。在mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应值,然后根据匹配的索引记录找到对应的行。原创 2020-08-13 20:08:43 · 1164 阅读 · 1 评论 -
MySQL企业性能优化一:多种优化 方式介绍
我们常见的数据库性能优化就是SQL语句优化,确实SQL优化是开发者接触到最多的也是最常有的优化手段。作为开发人员我们接触最多的也就是SQL语句的优化,SQL语句的优化除了调整SQL语句外更多的是通过添加索引来加速查询,表结构(合理设计字段、拆分字段到其它表、分表等)的优化也是我们优化的主要手段。原创 2020-06-02 02:21:31 · 440 阅读 · 0 评论