MySQL实战
文章平均质量分 88
MySQL实战
蓝颜~岁月
重在积累。。。
展开
-
Mysql Join原理分析
mysql> select * from t1 left join t2 on t1.name=t2.name说明:t1 表为驱动表t2 表为被驱动表小表为驱动表join 语句执行过程中,驱动表是走全表扫描,而被驱动表是走树搜索。当name 在t2 表中有索引时:通过Index Nested-Loop Join 算法,执行过程:从 t1 表中读入一行数据 R;从数据行 R 中,取出 name 字段到表 t2 里去查找;通过name 字段值去查找 t2 表中满足的值,通过嵌套原创 2022-03-31 17:59:00 · 511 阅读 · 0 评论 -
MySQL为什么表删除,表文件大小不变呢?
接下来,我会先和你说明为什么简单地删除表数据达不到表空间回收的效果,然后再和你介绍正确回收空间的方法。参数 innodb_file_per_table表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数innodb_file_per_table 控制的:这个参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起。这个参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中。从mysql 5.6.6版本开始这个默认值就原创 2022-03-19 15:03:28 · 795 阅读 · 0 评论 -
MySQL查询为啥会突然的慢?
你的 SQL 语句为什么变“慢”了?在前面文章《一条 SQL 更新语句是如何执行的?》中,InnoDB 在处理更新语句的时候,只做了写日志的磁盘操作,这个日志为redo log(重做日志)。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。不论是脏页还是干净页,都在内存中。答案:SQL 慢的原因,有可能就是在刷脏页。什么情况会引发数据库的 flush 过程呢?原因就是 InnoDB 的 redo log原创 2022-03-15 16:01:27 · 2079 阅读 · 0 评论 -
MySQL 怎么给字符串字段加索引?
现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64), ... )engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:mysql> select f1, f2 from SUser wher原创 2022-03-14 22:06:49 · 1308 阅读 · 0 评论 -
MySQL为什么有时候会选错索引?
前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由MySQL 来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?我们一起来看一个例子吧。我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引:CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11)原创 2022-03-09 22:06:30 · 163 阅读 · 0 评论 -
MySQL 普通索引和唯一索引
在前面的基础篇文章中,我给你介绍过索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈,在不同的业务场景下,应该选择普通索引,还是唯一索引?假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:mysql> select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所以,你一定会考虑在原创 2022-03-08 21:33:18 · 482 阅读 · 2 评论 -
MySQL 事务隔离的案例说明
我在前面文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,我在上一篇文章中,和你分享行锁的时候又提到,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数原创 2022-03-07 21:54:11 · 148 阅读 · 0 评论 -
MySQL锁时的现象及原理(二)
在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,今天我们就来讲讲 MySQL的行锁。MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。我们今天就主要来聊聊 InnoDB 的行锁,以及如何通过减少锁冲突来提升业务并发度。顾原创 2022-03-06 21:20:25 · 109 阅读 · 0 评论 -
MySQL锁时的现象及原理(一)
今天我要跟你聊聊 MySQL 的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表级锁。而关于行锁的内容,我会留着在下一篇文章中再和你详细介绍。这里需要说明的是,锁的设计比较复杂,这两篇文章不会涉及锁的具体实现细节,主要介绍的是碰到锁时的现象和其背后的原理。全局锁顾名思义,全局锁就原创 2022-03-05 21:41:53 · 233 阅读 · 0 评论 -
MySQL 深入浅出索引(下)
在上一篇文章中,我和你介绍了 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 varchar(原创 2022-03-02 22:33:43 · 107 阅读 · 0 评论 -
MySQL 深入浅出索引(上)
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的知识点,加深你对数据库索引的理解。一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本原创 2022-03-01 22:54:39 · 106 阅读 · 0 评论 -
MySQL事物隔离原理篇
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MyS原创 2022-02-28 22:34:14 · 119 阅读 · 0 评论 -
MySQL更新语句原理篇
我们以下面的语句来讲今天的课:mysql> update test set c=c+1 where id=2;之前我们讲了查询语句的执行流程,更新语句也是同样会走一遍。你执行语句前要先连接数据库,这是连接器的工作。前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表 test 上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 id 这个索引。然后,执行器负责具体执行原创 2022-02-27 20:53:12 · 800 阅读 · 0 评论 -
MySQL查询语句原理篇
MySQL 的基础架构我就不讲了,之前的已经大致讲了一下:MySQL架构体系下面我用一个基础图表示一下:大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory原创 2022-02-26 21:23:37 · 277 阅读 · 0 评论