时间:2021-07-01 10:21:17 帮助过:19人阅读
前文着重介绍了MySQL的WHERE条件如何针对 单个 索引构造对应的SEL_ARG结构,本文是一个补充,将简单介绍多个索引对应的SEL_TREE结构。 对于一个完整的WHERE条件,MySQL会遍历所有可以使用的索引,逐一构造其对应的SEL_ARG结构,所有的SEL_ARG结构以指针数组
前文着重介绍了MySQL的WHERE条件如何针对单个索引构造对应的SEL_ARG结构,本文是一个补充,将简单介绍多个索引对应的SEL_TREE结构。
对于一个完整的WHERE条件,MySQL会遍历所有可以使用的索引,逐一构造其对应的SEL_ARG结构,所有的SEL_ARG结构以指针数组的形式存放在SEL_TREE->keys中。如果对应索引无法构造SEL_ARG,那么对应的指针为空。
class SEL_TREE :public Sql_alloc { ... SEL_ARG *keys[MAX_KEY]; ... };
gdb打印对应的结构:
(gdb) p $1 $2 = (SEL_TREE *) 0x7f59c4038348 (gdb) p *$1 $3 = { ... keys = {0x0, 0x7f59c4038598, 0x0 }, ... }
SEL_TREE是一个数组,但如果像他的名字,他如果真是一棵树的话,那么将是如下结构:
[ key1 part1 ] [ key1 part2 ] [ key1 part3 ] -\ /- $ $ - / SEL_ARG(-∞, 1) $ ===> SEL_ARG [5,5] ===> $ SEL_ARG [10,10] |...... | |^ $ $ |^ | | next|| $ $ next|| ......| | ||prev $ $ ||prev 0x0 | /--------->| || $ $ v \ | | | || $ $ SEL_ARG [12,12] \------| | | || $ $ [key4]| | | v| $ $ | | | SEL_ARG [2, 2] $=== next_key_part =====| $ | [link of SEL_ARG] | |^ $ | $ | / | next|| $ | $ |--------/ | ||prev $ |===>$ SEL_ARG[11,11] | [key3] | v| $ | $ |^ | \ SEL_ARG [3, 3] $=== next_key_part =====| $ next|| | $ $ ||prev | $ $ v| | SEL_ARG[14,14] [SEL_ARG] | ************************* \ | * structure of SEL_TREE * \------| ************************* [key2]| | | [ key1 part1 ] | / SEL_ARG (-∞,2] $ SEL_ARG [3,5) | | |^ $ /\ Black | | next|| $ / \ | [link of SEL_ARG] | ||prev $ / \ | / | | v| $ SEL_ARG (-∞,2] SEL_ARG (10,∞) |--------/ | | SEL_ARG [3,5) $ Red Red | [key1] |-------->| |^ $ | | next|| $ | | ||prev $ SEL_TREE | v| $ \ SEL_ARG (10,∞) $ $
(大图)
That's all. 本文较为简单。
原文地址:MySQL源码:Range访问方式相关的数据结构--续, 感谢原作者分享。