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‘;
时间: 2024-11-16 02:17:41