唠叨一下MySQL中包含IN子句的语句是怎样执行的(以MySQL 5.7的InnoDB存储引擎为例)。
准备工作
为了故事的顺利发展,我们先创建一个表:
CREATE TABLE t (
id INT NOT NULL AUTO_INCREMENT,
key1 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
KEY idx_key1 (key1)
) Engine=InnoDB CHARSET=utf8;
复制代码
可以看到表t
中包含两个索引:
- 以
id
列为主键的聚簇索引 - 为
key1
列建立的二级索引
这个表里边现在有10000条数据:
mysql> SELECT COUNT(*) FROM t;
+----------+
| COUNT(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)
复制代码
从B+树中定位记录
我们现在想执行下边这个语句:
SELECT * FROM t WHERE
key1 >= 'b' AND key1