自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 答疑第一弹

binlog(归档日志)和redo log(重做日志)配合崩溃恢复的时候,用的是反证法,说明了如果没有两阶段提交,会导致MySQL出现主备数据不一致等问题。在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的?我再放一次两阶段提交的图,方便你学习下面的内容。接下来,我们就一起分析一下在两阶段提交的不同时刻,MySQL异常重启会出现什么现象。

2024-09-24 15:35:42 176

原创 count(*)这么慢,我该怎么办?

你首先要明确的是,在不同的MySQL引擎中,count(*)有不同的实现方式。MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;而InnoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里需要注意的是,我们在这篇文章里讨论的是没有过滤条件的count(*),如果加了where 条件的话,MyISAM表也是不能返回得这么快的。那为什么InnoDB不跟MyISAM一样,也把数字存起来呢?

2024-09-24 14:41:34 655

原创 为什么表数据删掉一半,表文件大小不变?

在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里。而MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数据。接下来,我会先和你说明为什么简单地删除表数据达不到表空间回收的效果,然后再和你介绍正确回收空间的方法。

2024-09-24 11:17:52 726

原创 为什么MySql会抖一下

InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作redo log(重做日志),也就是《孔乙己》里咸亨酒店掌柜用来记账的粉板,在更新内存写完redo log后,就返回给客户端,本次更新成功。做下类比的话,掌柜记账的账本是数据文件,记账用的粉板是日志文件(redo log),掌柜的记忆就是内存。掌柜总要找时间把账本更新一下,这对应的就是把内存里的数据写入磁盘的过程,术语就是flush。在这个flush操作执行之前,孔乙己的赊账总额,其实跟掌柜手中账本里面的记录是不一致的。

2024-09-20 17:47:41 668

原创 怎么给字符串字段加索引

创建索引时,优先选择区分度大的字段或者字段前缀,在满足区分度的条件下,选择长度最短的字段。

2024-09-20 17:15:09 920

原创 实战-第三弹

主键索引上存储的是磁盘上数据的地址,非主键索引上存储的是主键ID,对于非主键索引,当我们要查询的字段很多,仅仅依靠索引字段无法满足查询要求的时候,就会涉及到一个回表的操作。有了上述知识,我们就能很快回答出来索引c,a是多余的,我们通过索引c就可以定位到数据的主键索引,主键索引a,b中又是按照a,b字段进行排序的,因此c,a索引是多余的。我们在创建表geek的时候创建了4个索引,分别是主键索引,索引c、ca、cb。主键的作用是存储数据,非主键索引索引的作用是加快查询速度。

2024-09-18 19:43:17 126

原创 实战-第二弹

重建索引k的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。这两种方式,你们觉得哪种更合理呢。

2024-09-18 19:29:13 134

原创 实战第一弹

肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。经过上述知识的复习,我们能很快的定位出来这个报错信息是在解析器阶段报出来的。当我们在执行SQL语句select * from T where k=1。回答这个问题之前,先熟悉一下MySql的执行流程。这个错误是在哪个阶段报出来的呢?

2024-09-18 11:26:27 314

原创 MySQL为什么有时候会选错索引?

不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于MySQL选错了索引,而导致执行速度变得很慢?我们一起来看一个例子吧。然后,我们往表t中插入10万行记录,取值按整数递增,即:(1,1,1),(2,2,2),(3,3,3) 直到(100000,100000,100000)。接下来,我们分析一条SQL语句你一定会说,这个语句还用分析吗,很简单呀,a上有索引,肯定是要使用索引a的。你说得没错,图1显示的就是使用explain命令看到的这条语句的执行情况。

2024-09-18 09:58:15 875

原创 唯一索引和普通索引如何选择

假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的SQL语句:所以,你一定会考虑在id_card字段上建索引。由于身份证号字段比较大,我不建议你把身份证号当做主键,那么现在你有两个选择,要么给id_card字段创建唯一索引,要么创建一个普通索引。如果业务代码已经保证了不会写入重复的身份证号,那么这两个选择逻辑上都是正确的。现在我要问你的是,从性能的角度考虑,你选择唯一索引还是普通索引呢?

2024-09-14 14:42:32 889

原创 MySql中的锁

命令:flush [表名] with read lock。锁定范围:整个数据库实例。使用场景:做整个库的逻辑备份。

2024-09-13 10:35:42 1098

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除