在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类:
- 我们 DBA 不让使用 join,使用 join 有什么问题呢?
- 如果有两个大小不同的表做 join,应该用哪个表做驱动表呢?
我就先跟你说说 join 语句到底是怎么执行的,然后再来回答这两个问题。
笨鸟先飞
在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类:
我就先跟你说说 join 语句到底是怎么执行的,然后再来回答这两个问题。
在一个主备关系中,每个备库接收主库的 binlog 并执行。正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。但是,MySQL 要提供高可用能力,只有最终一致性是不够的。为什么这么说呢?今天我就着重和你分析一下。
今天这篇文章我主要为你介绍主备的基本原理。理解了背后的设计原理,你也可以从业务开 发的角度,来借鉴这些设计思想。
下面我们围绕着这个问题出发:如何从一个单词表中随机选出三个单词,这个表的建表语句如下:
1 | CREATE TABLE `words` ( |
假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。假设这个表的部分定义是这样的:
1 | CREATE TABLE `t` ( |
这时,你的 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 里面的锁大致可以分成全局锁、表级锁和行锁三类。这里需要说明的是,锁的设计比较复杂,这篇文章不会涉及锁的具体实现细节,主要介绍的是碰到锁时的现象和其背后的原理。
今天的文章里,我将会以 InnoDB 为例,剖析 MySQL 在事务支持方面的特定实现,并基于原理给出相应的实践建议,希望这些案例能加深你对 MySQL 事务原理的理解。
SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )