1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
root<span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">50</span> <span style="color: rgba(128, 128, 128, 1);">></span> show <span style="color: rgba(0, 0, 255, 1);">create</span> <span style="color: rgba(0, 0, 255, 1);">table</span><span style="color: rgba(0, 0, 0, 1);"> t_numG </span><span style="color: rgba(128, 128, 128, 1);">***************************</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span>. row <span style="color: rgba(128, 128, 128, 1);">***************************</span> <span style="color: rgba(0, 0, 255, 1);">Table</span><span style="color: rgba(0, 0, 0, 1);">: t_num </span><span style="color: rgba(0, 0, 255, 1);">Create</span> <span style="color: rgba(0, 0, 255, 1);">Table</span>: <span style="color: rgba(0, 0, 255, 1);">CREATE</span> <span style="color: rgba(0, 0, 255, 1);">TABLE</span><span style="color: rgba(0, 0, 0, 1);"> `t_num` ( `id` </span><span style="color: rgba(0, 0, 255, 1);">int</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">11</span>) <span style="color: rgba(128, 128, 128, 1);">NOT</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span><span style="color: rgba(0, 0, 0, 1);"> AUTO_INCREMENT, `c1` </span><span style="color: rgba(0, 0, 255, 1);">int</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">11</span>) <span style="color: rgba(128, 128, 128, 1);">NOT</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span><span style="color: rgba(0, 0, 0, 1);">, `c2` </span><span style="color: rgba(0, 0, 255, 1);">varchar</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">11</span>) <span style="color: rgba(128, 128, 128, 1);">NOT</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span><span style="color: rgba(0, 0, 0, 1);">, </span><span style="color: rgba(0, 0, 255, 1);">PRIMARY</span> <span style="color: rgba(0, 0, 255, 1);">KEY</span><span style="color: rgba(0, 0, 0, 1);"> (`id`), </span><span style="color: rgba(0, 0, 255, 1);">KEY</span><span style="color: rgba(0, 0, 0, 1);"> `ix_c1` (`c1`) ) ENGINE</span><span style="color: rgba(128, 128, 128, 1);">=</span>InnoDB AUTO_INCREMENT<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">6</span> <span style="color: rgba(0, 0, 255, 1);">DEFAULT</span> CHARSET<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 0, 1);">utf8mb4 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">51</span> <span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> t_num; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+----+----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> c1 <span style="color: rgba(128, 128, 128, 1);">|</span> c2 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+----+----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">3</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">5</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+----+----+</span> <span style="color: rgba(0, 0, 0, 1);"> # 在c1字段上加上索引 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">52</span> <span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">alter</span> <span style="color: rgba(0, 0, 255, 1);">table</span> t_num <span style="color: rgba(0, 0, 255, 1);">add</span> <span style="color: rgba(0, 0, 255, 1);">index</span><span style="color: rgba(0, 0, 0, 1);"> ix_c1(c1); # 标准使用情况下,索引有效 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">55</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num <span style="color: rgba(0, 0, 255, 1);">where</span> c1 <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> t_num <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1 <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> const <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------+</span> |
1、条件字段函数操作
1 2 3 4 5 6 7 |
# 在where中c1上加上abs()绝对值函数,可以看到type<span style="color: rgba(128, 128, 128, 1);">=ALL</span><span style="color: rgba(0, 0, 0, 1);">,全表扫描,在Server层进行绝对值处理后进行比较 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">58</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num <span style="color: rgba(0, 0, 255, 1);">where</span> <span style="color: rgba(255, 0, 255, 1);">abs</span>(c1) <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> t_num <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">ALL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">5</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Using <span style="color: rgba(0, 0, 255, 1);">where</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> |
如上,对索引字段做函数操作,即where条件列上不干净时,可能会破坏索引值的有序性(按照c1的值有序组织索引树),因此优化器就决定放弃走索引树搜索功能。
但是,条件字段函数操作下,也并非完全的走全表扫描,优化器并非完全的放弃该字段索引。
1 2 3 4 5 6 7 |
# 选择查询的数据,只有id和c1字段,可以看到type<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 255, 1);">index</span><span style="color: rgba(0, 0, 0, 1);">,使用到了ix_c1索引 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">59</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> id,c1 <span style="color: rgba(0, 0, 255, 1);">from</span> t_num <span style="color: rgba(0, 0, 255, 1);">where</span> <span style="color: rgba(255, 0, 255, 1);">abs</span>(c1) <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+--------------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+--------------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> t_num <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">index</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">5</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Using <span style="color: rgba(0, 0, 255, 1);">where</span>; Using <span style="color: rgba(0, 0, 255, 1);">index</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+--------------------------+</span> |
如上,由于ix_c1索引树是根节点c1和叶子节点id构造的,虽然因为c1上的函数操作导致放弃索引定位,但优化器可以选择遍历该索引树,使用覆盖索引(Using index),无需回表,将所需的id和c1数据返回Server层后进行后续的abs()和where过滤。
2、条件字段运算操作
1 2 3 4 5 6 7 |
<span style="color: rgba(0, 0, 0, 1);"># where条件里,对c1进行运算操作 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">11</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">03</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num <span style="color: rgba(0, 0, 255, 1);">where</span> c1 <span style="color: rgba(128, 128, 128, 1);">+</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> t_num <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">ALL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">5</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Using <span style="color: rgba(0, 0, 255, 1);">where</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> |
如上,虽然“+1”的操作并没有破坏c1索引的有序性,但优化器仍然没有使用该索引快速定位。因此,等号左边,注意优化掉索引字段上的运算操作。
3、隐式类型转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span style="color: rgba(0, 0, 0, 1);"># 在c2字段上加上索引 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">30</span> <span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">alter</span> <span style="color: rgba(0, 0, 255, 1);">table</span> t_num <span style="color: rgba(0, 0, 255, 1);">add</span> <span style="color: rgba(0, 0, 255, 1);">index</span><span style="color: rgba(0, 0, 0, 1);"> ix_c2(c2); # 标准使用情况下(注:c2是varchar类型的),索引有效 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">30</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num <span style="color: rgba(0, 0, 255, 1);">where</span> c2 <span style="color: rgba(128, 128, 128, 1);">=</span> "<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span><span style="color: rgba(0, 0, 0, 1);">"; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> t_num <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c2 <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c2 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">42</span> <span style="color: rgba(128, 128, 128, 1);">|</span> const <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------+</span> <span style="color: rgba(0, 0, 0, 1);"> # 去掉等号右边值的引号,即字符串和数值进行比较,索引失效 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">30</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num <span style="color: rgba(0, 0, 255, 1);">where</span> c2 <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> t_num <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">ALL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c2 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">5</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">20.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Using <span style="color: rgba(0, 0, 255, 1);">where</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+</span> |
如上,c2字段是varchar类型,是字符串和数值的比较,此时,MySQL是将字符串转换成数字,即此处的c2被CAST(c2 AS signed int),这就相当于对条件字段做了函数操作,优化器放弃走树索引定位。
4、隐式字符编码转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# 创建一个t_cou表,表结构基本和前面的t_num相同,唯一不同的设置是表字符集CHARSET<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 0, 1);">utf8 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">14</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">02</span> <span style="color: rgba(128, 128, 128, 1);">></span> show <span style="color: rgba(0, 0, 255, 1);">create</span> <span style="color: rgba(0, 0, 255, 1);">table</span><span style="color: rgba(0, 0, 0, 1);"> t_couG </span><span style="color: rgba(128, 128, 128, 1);">***************************</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span>. row <span style="color: rgba(128, 128, 128, 1);">***************************</span> <span style="color: rgba(0, 0, 255, 1);">Table</span><span style="color: rgba(0, 0, 0, 1);">: t_cou </span><span style="color: rgba(0, 0, 255, 1);">Create</span> <span style="color: rgba(0, 0, 255, 1);">Table</span>: <span style="color: rgba(0, 0, 255, 1);">CREATE</span> <span style="color: rgba(0, 0, 255, 1);">TABLE</span><span style="color: rgba(0, 0, 0, 1);"> `t_cou` ( `id` </span><span style="color: rgba(0, 0, 255, 1);">int</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">11</span>) <span style="color: rgba(128, 128, 128, 1);">NOT</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span><span style="color: rgba(0, 0, 0, 1);"> AUTO_INCREMENT, `c1` </span><span style="color: rgba(0, 0, 255, 1);">int</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">11</span>) <span style="color: rgba(128, 128, 128, 1);">NOT</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span><span style="color: rgba(0, 0, 0, 1);">, `c2` </span><span style="color: rgba(0, 0, 255, 1);">varchar</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">10</span>) <span style="color: rgba(128, 128, 128, 1);">NOT</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span><span style="color: rgba(0, 0, 0, 1);">, </span><span style="color: rgba(0, 0, 255, 1);">PRIMARY</span> <span style="color: rgba(0, 0, 255, 1);">KEY</span><span style="color: rgba(0, 0, 0, 1);"> (`id`), </span><span style="color: rgba(0, 0, 255, 1);">KEY</span><span style="color: rgba(0, 0, 0, 1);"> `ix_c1` (`c1`), </span><span style="color: rgba(0, 0, 255, 1);">KEY</span><span style="color: rgba(0, 0, 0, 1);"> `ix_c2` (`c2`) ) ENGINE</span><span style="color: rgba(128, 128, 128, 1);">=</span>InnoDB AUTO_INCREMENT<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(0, 0, 255, 1);">DEFAULT</span> CHARSET<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 0, 1);">utf8 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">14</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">02</span> <span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">insert</span> <span style="color: rgba(0, 0, 255, 1);">into</span> t_cou <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> t_num; # join表,t_num和t_cou通过c2字段进行关联查询 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">14</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">03</span> <span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> n.<span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> t_num n </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(128, 128, 128, 1);">join</span><span style="color: rgba(0, 0, 0, 1);"> t_cou c </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">on</span> n.c2 <span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 0, 1);"> c.c2 </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> n.c1 <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+----+----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> c1 <span style="color: rgba(128, 128, 128, 1);">|</span> c2 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+----+----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+----+----+</span> <span style="color: rgba(0, 0, 0, 1);"> root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">14</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">23</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> n.<span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num n <span style="color: rgba(128, 128, 128, 1);">join</span> t_cou c <span style="color: rgba(0, 0, 255, 1);">on</span> n.c2 <span style="color: rgba(128, 128, 128, 1);">=</span> c.c2 <span style="color: rgba(0, 0, 255, 1);">where</span> c.c1 <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-----------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-----------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> c <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1 <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> const <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> n <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c2 <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c2 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">42</span> <span style="color: rgba(128, 128, 128, 1);">|</span> func <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100.00</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Using <span style="color: rgba(0, 0, 255, 1);">index</span> condition <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-----------------------+</span> <span style="color: rgba(0, 0, 0, 1);"># 执行计划分析: # </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">.操作的c表,使用了ix_c1定位到一行数据 # </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span><span style="color: rgba(0, 0, 0, 1);">.从c表定位到的行数据,拿到c2字段去操作n表,t_cou称为驱动表,t_num称为被驱动表 # </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">3</span>.ref<span style="color: rgba(128, 128, 128, 1);">=</span>func说明使用了函数操作,指的是n.c2<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(255, 0, 255, 1);">CONVERT</span><span style="color: rgba(0, 0, 0, 1);">(c.c2 USING utf8mb4) # </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span>.同时Using <span style="color: rgba(0, 0, 255, 1);">index</span><span style="color: rgba(0, 0, 0, 1);"> condition,ix_c2读取查询时,使用被下推的条件过滤,满足条件的才回表 root</span><span style="color: rgba(0, 128, 0, 1);">@test</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">14</span>:<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">23</span> <span style="color: rgba(128, 128, 128, 1);">></span> explain <span style="color: rgba(0, 0, 255, 1);">select</span> n.<span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span> t_num n <span style="color: rgba(128, 128, 128, 1);">join</span> t_cou c <span style="color: rgba(0, 0, 255, 1);">on</span> n.c2 <span style="color: rgba(128, 128, 128, 1);">=</span> c.c2 <span style="color: rgba(0, 0, 255, 1);">where</span> n.c1 <span style="color: rgba(128, 128, 128, 1);">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span><span style="color: rgba(0, 0, 0, 1);">; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+-------+---------------+-------+---------+-------+------+----------+-----------------------------------------------------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> id <span style="color: rgba(128, 128, 128, 1);">|</span> select_type <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">|</span> partitions <span style="color: rgba(128, 128, 128, 1);">|</span> type <span style="color: rgba(128, 128, 128, 1);">|</span> possible_keys <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">key</span> <span style="color: rgba(128, 128, 128, 1);">|</span> key_len <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> rows <span style="color: rgba(128, 128, 128, 1);">|</span> filtered <span style="color: rgba(128, 128, 128, 1);">|</span> Extra <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--+-------------+-------+------------+-------+---------------+-------+---------+-------+------+----------+-----------------------------------------------------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> SIMPLE <span style="color: rgba(128, 128, 128, 1);">|</span> n <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">NULL</span> <span style="color: rgba(128, 128, 128, 1);">|</span> ref <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1,ix_c2 <span style="color: rgba(128, 128, 128, 1);">|</span> ix_c1 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> const <span style="color: rgba(128, 128, 128, 1);">|</span> |