前文着重介绍了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访问方式相关的数据结构--续, 感谢原作者分享。