随笔分类 - MySQL
摘要:MySQL 在进行 Order By 操作排序时,通常有两种排序方式: 全字段排序 Row_id 排序 MySQL 中每个线程在执行排序时,都会被分配一块区域 - sort buffer,它的大小通过 sort_buffer_size 控制。 全字段排序指的是,将要查询的字段,全都存入 sort b
阅读全文
摘要:在之前InooDB 加锁总结的文章中,讨论了大量在 RR 情况下 MySQL 如何加锁的案例。而这篇相较于前一篇,更偏重于实践,主要是在遇到锁等待或者死锁时,如何分析和解决问题。这篇讲解的案例全都基于 RC 隔离级别,MySQL 版本为 5.7.x. 我们知道,RC 相较于 RR 在很大程度上调高了
阅读全文
摘要:对于运行很长时间的数据库来说,往往会出现表占用存储空间过大的问题,可是将许多没用的表删除之后,表文件的大小并没有改变,想解决这个问题,就需要了解 InnoDB 如何回收表空间的。 对于一张表来说,占用空间重要分为两部分,表结构和表数据。通常来说,表结构定义占用的空间很小。所以空间的问题主要和表数据有
阅读全文
摘要:有时会碰到这样的情况,一条 SQL 在平时执行没问题,很快。但是突然某个时间执行的就会很慢,而且这种场景并不能复现,只能随机发送的。 SQL 执行突然变慢的原因 在之前讲解 MySQL Redo log 时,说到了 WAL 机制,为了保证 MySQL 更新的速度,在进行更新操作时,先将更新内容写入
阅读全文
摘要:这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选择合适的 EXISTS 和 IN 子查询 了解 SQL SQL 是我们用来最长和数据打交道的方式之一
阅读全文
摘要:字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add index index1(email); 对整个字符串的前一部分建立索引 - 前缀索引 alter ta
阅读全文
摘要:现在随着各种数据库框架的盛行,在提高效率的同时也让我们忽略了很多底层的连接过程,这篇文章是对 SQL 连接过程梳理,并涉及到了现在常用的 SQL 标准。 其实标准就是在不同的时间,制定的一些写法或规范。 从 SQL 标准说起 在编写 SQL 语句前,需要先了解在不同版本的规范,因为随着版本的变化,在
阅读全文
摘要:MySQL 中,可以为某张表指定多个索引,但在语句具体执行时,选用哪个索引是由 MySQL 中执行器确定的。那么执行器选择索引的原则是什么,以及会不会出现选错索引的情况呢? 先看这样一个例子: 创建表 Y,设置两个普通索引, 创建一个存储过程用于插入数据。 MySQL: 5.7.27, 隔离级别:
阅读全文
摘要:想象这样一个场景,在设计一张用户表时,每人的身份证号是唯一的,需要搜索。但由于身份证号字段较大,不好将其作为主键。在业务代码已经保证插入身份证唯一的情况下,可以选择建立唯一索引和普通普通索引,这时该如何选择呢?接下来,将从查询和更新的执行过程进行分析。 查询过程 假设 k 是表 t 上的索引,在搜索
阅读全文
摘要:MySQL count() 函数我们并不陌生,用来统计每张表的行数。但如果你的表越来越大,且是 InnoDB 引擎的话,会发现计算的速度会越来越慢。在这篇文章里,会先介绍 count() 实现的原理及原因,然后是 count 不同用法的性能分析,最后给出需要频繁改变并需要统计表行数的解决方案。 Co
阅读全文
摘要:MySQL 在整体架构上分为 Server 层和存储引擎层。其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎层负责数据的存储和提取,如 InnoDB、MyISAM、Memory 等引擎。在客户端连接到 Server 层后,
阅读全文
摘要:几个月之前,开始深入学习 MySQL 。说起数据库,并发控制是其中很重要的一部分。于是,就这样开起了 MySQL 锁的学习,随着学习的深入,发现想要更好的理解锁,需要了解 MySQL 事务,数据底层的存储方式,MySQL 的执行流程,特别是索引的选择等。 在学习期间,查找了不少资料,现根据个人的理解
阅读全文
摘要:在MySQL事务初识中,我们了解到不同的事务隔离级别会引发不同的问题,如在 RR 级别下会出现幻读。但如果将存储引擎选为 InnoDB ,在 RR 级别下,幻读的问题就会被解决。在这篇文章中,会先介绍什么是幻读、幻读会带来引起那些问题以及 InnoDB 解决幻读的思路。 实验环境:RR,MySQL
阅读全文
摘要:我们知道在 RR 级别下,对于一个事务来说,读到的值应该是相同的,但有没有想过为什么会这样,它是如何实现的?会不会有一些特殊的情况存在?本篇文章会详细的讲解 RR 级别下事务隔离的原理。在阅读后应该了解如下的内容: 了解 MySQL 中的两种视图 了解 RR 级别下,如何实现的事务隔离 了解什么是当
阅读全文
摘要:为什么要有锁? 我们都是知道,数据库中锁的设计是解决多用户同时访问共享资源时的并发问题。在访问共享资源时,锁定义了用户访问的规则。根据加锁的范围,MySQL 中的锁可大致分成全局锁,表级锁和行锁三类。在本篇文章中,会依次介绍三种类型的锁。在阅读本篇文章后,应该掌握如下的内容: 为什么要在备份时使用全
阅读全文
摘要:在本篇文章中,开始部分会介绍索引的定义,及常见索引使用的数据结构和 MySQL 的索引模型。然后,根据索引的存储结构来学习索引的建立原则。最后会介绍索引的使用场景。在阅读后,应该了解如下的内容: 索引场景的模型:哈希表,有序数组和搜索树 MySQL 的索引模型,了解主键/非主键索引,回表,页分裂的概
阅读全文
摘要:本篇文章会围绕着事务展开,在阅读后应该了解如下的内容: 什么是事务,不遵循事务会有什么问题? 事务需要满足的特性? 多个事务同时执行时,会存在哪些问题,如何解决? MVCC 概念? 长事务的危害? 对 MySQL 来说,事务通常是一组包含对数据库操作的集合。在执行时,只有在该组内的事务都执行成功,这
阅读全文
摘要:日常开发,运维中,经常会出现误删数据的情况。误删数据的类型大致可分为以下几类: 使用 delete 误删行 使用 drop table 或 truncate table 误删表 使用 drop database 语句误删数据库 使用 rm 命令误删整个 MySQL 实例。 不同的情况,都会有其优先的
阅读全文
摘要:mysqldump 本篇主要记录使用 mysqldump 备份数据库操作过程。 在阅读后,应该能回答如下内容: 在备份数据时,同时更新数据会有问题吗? 导出数据时,遇到大表怎么办? 全量备份的方法? 什么是 mysqldump ? mysqldump 是 MySQL 用于执行逻辑备份的一款工具,可以
阅读全文