32 为什么还有kill不掉的语句? 32 为什么还有kill不掉的语句?在 MySQL 中有两个 kill 命令:一个是 kill query + 线程 id,表示终止这个线程中正在执行的语句;一个是 killconnection + 线程 id,这里 connection可缺省,表示断开这个线程的连接,当然如果这个线程有语句正在执行,也是要先停止正在执行的语句的。 不知道你在使用 MySQL 的时候,有没有遇 2022-08-23 专栏 > MySQL实战45讲
33 我查这么多数据,会不会把数据库内存打爆? 33 我查这么多数据,会不会把数据库内存打爆?我经常会被问到这样一个问题:我的主机内存只有 100G,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了? 这个问题确实值得担心,被系统 OOM(out ofmemory)可不是闹着玩的。但是,反过来想想,逻辑备份的时候,可不就是做整库扫描吗?如果这样就会把内存吃光,逻辑备份不是早就挂了? 所以说,对大表做 2022-08-23 专栏 > MySQL实战45讲
34 到底可不可以使用join? 34 到底可不可以使用join?在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类: 我们 DBA 不让使用 join,使用 join 有什么问题呢? 如果有两个大小不同的表做 join,应该用哪个表做驱动表呢? 今天这篇文章,我就先跟你说说 join 语句到底是怎么执行的,然后再来回答这两个问题。 为了便于量化分析,我还是创建两个表 t1 和 t2 来和 2022-08-23 专栏 > MySQL实战45讲
35 join语句怎么优化? 35 join语句怎么优化?在上一篇文章中,我和你介绍了 join 语句的两种算法,分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。 我们发现在使用 NLJ 算法的时候,其实效果还是不错的,比通过应用层拆分成多个语句然后再拼接查询结果更方便,而且性能也不会差。 但是,BNL 算法在大表 join 的时 2022-08-23 专栏 > MySQL实战45讲
37 什么时候会使用内部临时表? 37 什么时候会使用内部临时表?在[第 16]和[第 34]篇文章中,我分别和你介绍了 sort buffer、内存临时表和 joinbuffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助 SQL 语句的执行的。其中,我们在排序的时候用到了 sort buffer,在使用join 语句的时候用到了 join buffer。 然后,你可能会有这样的疑问,MyS 2022-08-23 专栏 > MySQL实战45讲
38 都说InnoDB好,那还要不要使用Memory引擎? 38 都说InnoDB好,那还要不要使用Memory引擎?我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0这个值在最后一行;而使用磁盘临时表得到的结果里,0 这个值在第一行? 今天我们就来看看,出现这个问题的原因吧。 内存表的数据组织结构为了便于分析,我来把这个问题简化一下,假设有以下的 2022-08-23 专栏 > MySQL实战45讲
39 自增主键为什么不是连续的? 39 自增主键为什么不是连续的?在[第 4 篇文章]中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。 之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不能保证连续递增。 今天这篇文章,我们就来说说这个问题,看看什么情况下自增主键会出现 “空洞” 2022-08-23 专栏 > MySQL实战45讲
40 insert语句的锁为什么这么多? 40 insert语句的锁为什么这么多?在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁。 因此,insert 语句是一个很轻量的操作。不过,这个结论对于“普通的 insert 语句”才有效。也就是说,还有些 insert语句是属于“特殊情况”的,在执行过程中需要给其他资源加锁,或者无法在申请到自增 id 以后就立马释放自增 2022-08-23 专栏 > MySQL实战45讲
36 为什么临时表可以重名? 36 为什么临时表可以重名?在上一篇文章中,我们在优化 join 查询的时候使用到了临时表。当时,我们是这么用的: create temporary table temp_t like t1; alter table temp_t add index(b); insert into temp_t select * from t2 where b>=1 and b< 2022-08-23 专栏 > MySQL实战45讲
41 怎么最快地复制一张表? 41 怎么最快地复制一张表?我在上一篇文章最后,给你留下的问题是怎么在两张表中拷贝数据。如果可以控制对源表的扫描行数和加锁范围很小的话,我们简单地使用 insert … select语句即可实现。 当然,为了避免对源表加读锁,更稳妥的方案是先将数据写到外部文本文件,然后再写回目标表。这时,有两种常用的方法。接下来的内容,我会和你详细展开一下这两种方法。 为了便于说明,我还是先 2022-08-23 专栏 > MySQL实战45讲