美文网首页
mysql 主键索引,联合索引,单列索引使用场景

mysql 主键索引,联合索引,单列索引使用场景

作者: 爲誰而来 | 来源:发表于2019-03-14 17:05 被阅读0次

    表button 

    CREATE TABLE `button` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT,  --主键索引

      `button_name` varchar(45) NOT NULL COMMENT '功能名称',

      `app_id` bigint(20) NOT NULL,

      `permission_id` bigint(20) DEFAULT NULL,  -- permission_id 和 app_id 联合索引。

      `api_id` bigint(20) NOT NULL, --api_id单独索引

      PRIMARY KEY (`id`),

      KEY `index_app_permission_lianhe` (`permission_id`,`app_id`) USING BTREE,

      KEY `index_api_id_dange` (`api_id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

    主键索引,单独索引,组合索引使用场景及优化

    表button 有3个索引,分别是:id主键,联合索引(permission_id,app_id),api_id(单列索引)

    button_name 无索引

    查询where条件中:

    主键索引:

    1、主键索引与联合索引同时存在,使用主键索引

    2、主键索引与单个索引同时存在,使用主键索引

    结论:只要主键索引在,使用主键索引。

    联合索引 :

    1、联合索引与单列索引列 同时存在,使用单列索引

    2、联合索引中列顺序颠倒无影响。

    3、联合索引实行最左侧原则,即:单独查询条件中只有permission_id可以使用联合索引,单独查询条件中只有app_id不实用联合索引。

    4、如果查询条件中只有app_id,但是select 条件中有 permission_id,则也使用联合索引。

    5、select id,app_id from button where app_id=1001; 使用联合索引

    6、explain select id,app_id,button_name from button where app_id=1001;不使用联合索引

    结论:索引优先级:主键索引,单列索引,组合索引

        联合索引中遵从最左侧列原则。

        当查询条件和返回结果中仅仅包含联合索引中索引项,也使用联合索引。如第4条。

        当查询条件中出现联合索引中非最左侧索引列,返回结果中含义联合索引中的列或者主键则也使用联合索引。

    单个索引:

    1、查询条件中有单列索引,则使用,无不使用。

    事例:

    相关文章

      网友评论

          本文标题:mysql 主键索引,联合索引,单列索引使用场景

          本文链接:https://www.haomeiwen.com/subject/svecmqtx.html