![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 89
白泽-默
路尽隐香处,翩然雪海间。
展开
-
分库分表太坑啦!
分库分表,看完之后的感悟就是,能不用就不用!!一用就会有超多问题,果然每个技术不仅有优点而且背后都是有超级大的成本的,接下来我就来分享一下分库分表。原创 2022-12-05 17:49:55 · 1525 阅读 · 1 评论 -
MySQL实战45讲--到底可不可以使用join?(34)
在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类:我们 DBA 不让使用 join,使用 join 有什么问题呢? 如果有两个大小不同的表做 join,应该用哪个表做驱动表呢?今天这篇文章,我就先跟你说说 join 语句到底是怎么执行的,然后再来回答这两个问题。为了便于量化分析,我还是创建两个表 t1 和 t2 来和你说明。CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL,...转载 2021-01-26 17:51:04 · 134 阅读 · 0 评论 -
MySQL实战45讲--日志和索引相关问题(15)
到目前为止,已经收集了 47 个问题,很难通过今天这一篇文章全部展开。所以,我就先从中找了几个联系非常紧密的问题,串了起来,希望可以帮你解决关于日志和索引的一些疑惑。而其他问题,我们就留着后面慢慢展开吧。日志相关问题在第 2 篇文章《日志系统:一条 SQL 更新语句是如何执行的?》中,和你讲到 binlog(归档日志)和 redo log(重做日志)配合崩溃恢复的时候,用的是反证法,说明了如果没有两阶段提交,会导致 MySQL 出现主备数据不一致等问题。在这篇文章下面,很多同学在问,在两阶段提交转载 2021-01-11 21:54:43 · 169 阅读 · 0 评论 -
MySQL实战45讲--count(*)这么慢,我该怎么办?(14)
在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL 怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。那么今天,我们就来聊聊 count(*) 语句到底是怎样实现的,以及 MySQL 为什么会这么实现。然后,我会再和你说说,如果应用中有这种频繁变更并需要统计表行数的需求,转载 2021-01-08 16:41:45 · 143 阅读 · 0 评论 -
MySQL实战45讲--为什么表数据删掉一半,表文件大小不变?(13)
经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题。这里,我们还是针对 MySQL 中应用最广泛的 InnoDB 引擎展开讨论。一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数转载 2021-01-08 16:39:06 · 157 阅读 · 0 评论 -
MySQL实战45讲--为什么我的MySQL会“抖”一下?(12)
平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。看上去,这就像是数据库“抖”了一下。今天,我们就一起来看一看这是什么原因。你的 SQL 语句为什么变“慢”了在前面第 2 篇文章《日志系统:一条 SQL 更新语句是如何执行的?》中,我为你介绍了 WAL 机制。现在你知道了,InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo转载 2021-01-08 16:22:25 · 136 阅读 · 0 评论 -
MySQL实战45讲--怎么给字符串字段加索引?(11)
现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。预热问题 1.字符串加索引有什么问题? 字符串可能比较长. 2.怎么给字符串加索引? a.前缀? b.截取中间部分? 3.怎么查看字符串索引的空间时间消耗?假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64),...)engi..转载 2021-01-07 13:15:05 · 164 阅读 · 0 评论 -
MySQL实战45讲--MySQL为什么有时候会选错索引?(10)
前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引:CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAU..转载 2021-01-05 21:44:48 · 132 阅读 · 0 评论 -
MySQL实战45讲--普通索引和唯一索引,应该怎么选择?(09)
在前面的基础篇文章中,我给你介绍过索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈,在不同的业务场景下,应该选择普通索引,还是唯一索引?假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所以,你一定会考虑在 id_car转载 2021-01-05 21:13:40 · 131 阅读 · 0 评论 -
MySQL实战45讲--事务到底是隔离的还是不隔离的?(08)
在第 3 篇文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,我在上一篇文章中,和你分享行锁的时候又提到,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要转载 2021-01-04 21:41:39 · 171 阅读 · 1 评论 -
MySQL实战45讲--行锁功过:怎么减少行锁对性能的影响?(07)
在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,本篇我们就来讲讲 MySQL 的行锁。MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。我们今天就主要来聊聊 InnoDB 的行锁,以及如何通过减少锁冲突来提升业务并发转载 2021-01-04 20:40:24 · 153 阅读 · 0 评论 -
MySQL实战45讲--全局锁和表锁 :给表加个字段怎么有这么多阻碍?(06)
今天聊聊 MySQL 的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表级锁。而关于行锁的内容,我会留着在下一篇文章中再和你详细介绍。这里需要说明的是,锁的设计比较复杂,这两篇文章不会涉及锁的具体实现细节,主要介绍的是碰到锁时的现象和其背后的原理。全局锁顾名思义,全局锁就转载 2021-01-04 13:14:18 · 127 阅读 · 0 评论 -
MySQL实战45讲--深入浅出索引(下)(05)
在上一篇文章中,介绍了 InnoDB 索引的数据结构模型,今天我们再继续聊聊跟 MySQL 索引有关的概念。在开始这篇文章之前,我们先来看一下这个问题:在下面这个表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?下面是这个表的初始化语句。mysql> create table T (ID int primary key,k int NOT NULL DEFAULT 0,s varch.转载 2021-01-04 12:49:33 · 177 阅读 · 1 评论 -
MySQL实战45讲--深入浅出索引(上)(04)
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的知识点,加深你对数据库索引的理解。一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。转载 2021-01-04 11:59:37 · 161 阅读 · 0 评论 -
MySQL实战45讲--事务隔离:为什么你改了我还看不见?(03)
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 M转载 2021-01-03 21:43:21 · 164 阅读 · 0 评论 -
MySQL实战45讲--日志系统:一条SQL更新语句是如何执行的?(02)
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c:mysql> crea转载 2021-01-03 21:24:55 · 131 阅读 · 0 评论 -
MySQL实战45讲--基础架构:一条SQL查询语句是如何执行的?(01)
这是专栏的第一篇文章,聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:mysql> select * from T where ID=10;我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程。所以今天我想和你一起转载 2021-01-03 20:53:23 · 112 阅读 · 0 评论 -
MySQL实战45讲--让我们一起来搞懂MySQL目录大纲(0)
在这里,有一份目录,你也可以先了解下整个专栏的知识结构。如前面说的,这几条主线上的每个知识点几乎都不是最新的,有些甚至十年前就这样,并没有改过。但我希望针对这些点的说明,可以让你在使用 MySQL 时心里更有底,知道怎么做选择,并且明白为什么。了解了原理,才能在实践中不断创新,提升个人的价值和工作输出。从这里开始,跟我一起搞懂 MySQL!...转载 2021-01-03 20:39:10 · 242 阅读 · 0 评论 -
Mac MySQL安装和MySQL命令行
2018/04/17安装MySQL (切记系统通知发过来的的初始密码)之后初次登录需要密码https://segmentfault.com/a/1190000008472692https://blog.csdn.net/pansanday/article/details/54915916安装MySQL图形化界面工具(可不安装)链接数据库查看 mysql 端口号的方法是showglobalvar...原创 2020-12-10 22:11:31 · 6598 阅读 · 1 评论