MySQL 二级索引会不会自动补齐主键(2)

| id | select_type | table | type | possible_keys | key  | key_len | ref         | rows | Extra       |

+----+-------------+-------+------+---------------+------+---------+-------------+------+-------------+

|  1 | SIMPLE      | t01   | ref  | idx2          | idx2 | 192     | const,const |    3 | Using where |

+----+-------------+-------+------+---------------+------+---------+-------------+------+-------------+

MySQL 5.6.16 源码 storage/innobase/dict/dict0dict.cc

/*******************************************************************//**

Builds the internal dictionary cache representation for a clustered

index, containing also system fields not defined by the user.

@return own: the internal representation of the clustered index */

static

dict_index_t*

dict_index_build_internal_clust(

/*============================*/

    const dict_table_t*    table,  /*!< in: table */

    dict_index_t*      index)  /*!< in: user representation of

                    a clustered index */

{

    dict_index_t*  new_index;

    dict_field_t*  field;

    ulint      trx_id_pos;

    ulint      i;

    ibool*      indexed;

 

    ut_ad(table && index);

    ut_ad(dict_index_is_clust(index));

    ut_ad(mutex_own(&(dict_sys->mutex)));

    ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);

 

    /* Create a new index object with certainly enough fields */

    new_index = dict_mem_index_create(table->name,

                      index->name, table->space,

                      index->type,

                      index->n_fields + table->n_cols);

    /* Remember the table columns already contained in new_index */

    indexed = static_cast<ibool*>(

        mem_zalloc(table->n_cols * sizeof *indexed));

 

    /* Mark the table columns already contained in new_index */

    for (i = 0; i < new_index->n_def; i++) {

 

        field = dict_index_get_nth_field(new_index, i);

 

        /* If there is only a prefix of the column in the index

        field, do not mark the column as contained in the index */

 

        if (field->prefix_len == 0) {

 

            indexed[field->col->ind] = TRUE;

        }

    }

总结:

1.从源代码看出在引擎层是做了主动补齐主键到二级索引的最后面,但是server层并不知道主键补齐到后面,mysql server层不一定动能自动识别二级索引后面的主键列,强烈建议创建二级索引的时候加上主键列。

2.我上面的演示实例M ySQL server层是自动自动识别了二级索引后的主键列,看运气吧,目前还没遇到过不识别的。

--------------------------------------分割线 --------------------------------------

Ubuntu 14.04下安装MySQL

《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF

Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL

Ubuntu 14.04下搭建MySQL主从服务器

Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/478ee73a9541d8ae4bdf2d62e33052fa.html