mysql索引的艺术 单列索引与多列索引的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql索引的艺术 单列索引与多列索引的区别相关的知识,希望对你有一定的参考价值。

CREATE TABLE `security_role_resource` (
  `id` varchar(50) NOT NULL DEFAULT ‘‘,
  `role_id` varchar(50) DEFAULT NULL,
  `resource_id` varchar(50) DEFAULT NULL,
  `date_create` timestamp NULL DEFAULT NULL,
  `date_update` timestamp NULL DEFAULT NULL,
  `date_delete` timestamp NULL DEFAULT NULL,
  `parent_shop_code` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_role_id` (`role_id`),
  KEY `index_resource_id` (`resource_id`),
  KEY `index_parent_shop_code` (`parent_shop_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `security_role_resource2` (
  `id` varchar(50) NOT NULL DEFAULT ‘‘,
  `role_id` varchar(50) DEFAULT NULL,
  `resource_id` varchar(50) DEFAULT NULL,
  `date_create` timestamp NULL DEFAULT NULL,
  `date_update` timestamp NULL DEFAULT NULL,
  `date_delete` timestamp NULL DEFAULT NULL,
  `parent_shop_code` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_parent_shop_code_role_id_resource_id` (`parent_shop_code`,`role_id`,`resource_id`),
  KEY `index_role_id` (`role_id`),
  KEY `index_resource_id` (`resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

两个表的区别在于第二表是组合索引,组合了`parent_shop_code`,`role_id`,`resource_id`三列

单独的每个有索引的列查询没有区别,但是如果多个条件一起查询

explain select * from security_role_resource2 where parent_shop_code=002142 and resource_id=PNqiYZbiNN and role_id=GBcvY87pCq ;

技术分享

mysql的处理方式不一样了,它会选择一个最严格的索引来进行检索,可以理解为检索能力最强的那个索引来检索,另外几个索引利用不上了,这样效果就不如多列索引了。

现在同样的查询条件对第一个表查询

explain select * from security_role_resource where parent_shop_code=002142 and resource_id=PNqiYZbiNN and role_id=GBcvY87pCq ;

技术分享

下面这样的查询用不到组合索引:

explain select * from security_role_resource where parent_shop_code=002142 or role_id=GBcvY87pCq;

技术分享

 

以上是关于mysql索引的艺术 单列索引与多列索引的区别的主要内容,如果未能解决你的问题,请参考以下文章

(2.8)Mysql之SQL基础——索引的分类与使用

MySQL数据库的索引类型

mysql中index与Multiple-Column Indexes区别与联系

MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引

Mysql-索引类型篇

Day515.索引的创建与设计原则 -mysql