0%

在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类:

  1. 我们 DBA 不让使用 join,使用 join 有什么问题呢?
  2. 如果有两个大小不同的表做 join,应该用哪个表做驱动表呢?

我就先跟你说说 join 语句到底是怎么执行的,然后再来回答这两个问题。

阅读全文 »

在一个主备关系中,每个备库接收主库的 binlog 并执行。正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。但是,MySQL 要提供高可用能力,只有最终一致性是不够的。为什么这么说呢?今天我就着重和你分析一下。

阅读全文 »

今天这篇文章我主要为你介绍主备的基本原理。理解了背后的设计原理,你也可以从业务开 发的角度,来借鉴这些设计思想。

阅读全文 »

下面我们选取几个示例来说明。

1. 条件字段函数操作

假设你现在维护了一个交易系统,其中交易记录表 tradelog 包含交易流水号 (tradeid)、交易员 id(operator)、交易时间(t_modified)等字段。为了便于描述, 我们先忽略其他字段。这个表的建表语句如下:

阅读全文 »

下面我们围绕着这个问题出发:如何从一个单词表中随机选出三个单词,这个表的建表语句如下:

1
2
3
4
5
CREATE TABLE `words` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`word` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
阅读全文 »

假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。假设这个表的部分定义是这样的:

1
2
3
4
5
6
7
8
9
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`city` varchar(16) NOT NULL,
`name` varchar(16) NOT NULL,
`age` int(11) NOT NULL,
`addr` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `city` (`city`)
) ENGINE=InnoDB;

这时,你的 SQL 语句可以这么写:

1
select city,name,age from t where city='杭州' order by name limit 1000;

这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么执行的,以及有什么参数会影响执行的行为。

阅读全文 »

假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:

1
select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';

所以,你一定会考虑在 id_card 字段上建索引。从性能的角度考虑,你选择唯一索引还是普通索引呢?选择的依据是什么呢?

阅读全文 »

根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。这里需要说明的是,锁的设计比较复杂,这篇文章不会涉及锁的具体实现细节,主要介绍的是碰到锁时的现象和其背后的原理。

阅读全文 »

1. 索引的常见模型

索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。

阅读全文 »

今天的文章里,我将会以 InnoDB 为例,剖析 MySQL 在事务支持方面的特定实现,并基于原理给出相应的实践建议,希望这些案例能加深你对 MySQL 事务原理的理解。

1. 隔离性与隔离级别

SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )

  • 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
阅读全文 »