SQL优化 | OceanBase是否遵循最左匹配原则?(三)
1、问题背景
在MySQL数据库中,如果不满足最左匹配原则,索引会失效。那么在OceanBase数据库中:
- 是否有同样的问题?
- 如果不满足最左匹配原则,如何走上索引?
创建测试表和联合索引:
-- 创建测试表
CREATE TABLE tt (c1 INT,c2 INT,c3 INT
);
-- 添加联合索引
CREATE INDEX idx_tt ON tt(c2,c3);
2、模拟不同查询场景并查看执行计划
测试版本:oceanbase 4.2.1.3
2.1 满足最左匹配原则的查询
// 场景1 全字段匹配,符合索引前缀原则,可以使用索引
mysql> EXPLAIN BASIC SELECT * FROM tt where c2=1 and c3=2;
+--------------------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------------------+
| ===========================================================
|
| |ID|OPERATOR |NAME |
| --------------------------------
| |0 |TABLE RANGE SCAN|tt(idx_tt)|
| ===========================================================
|
| Outputs & filters:
| -------------------------------------
| 0 - output([tt.c1], [tt.c2], [tt.c3]), filter(nil), rowset=16
| access([tt.__pk_increment], [tt.c2], [tt.c3], [tt.c1]), partitions(p0)
| is_index_back=true, is_global_index=false,
| range_key([tt.c2], [tt.c3], [tt.__pk_increment]), range(1,2,MIN ; 1,2,MAX),
| range_cond([tt.c2 = 1], [tt.c3 = 2])
+--------------------------------------------------------------------------+
12 rows in set (0.00 sec)
// 场景2 过滤条件是c2,符合索引前缀原则,可以使用索引
mysql> EXPLAIN BASIC SELECT