1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > mysql条件查询出现or连接时会使用索引的场景

mysql条件查询出现or连接时会使用索引的场景

时间:2021-11-22 13:45:33

相关推荐

mysql条件查询出现or连接时会使用索引的场景

在做sql优化时,通常会避免使用or来进行条件连接,是因为大多数情况下or的条件连接会导致sql查询进行全表扫描而不会使用索引去查询。但并不是所有使用or的场景都会全表扫描,有些场景下使用or依旧会走索引去查询,下面举例说明。

表结构

CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(255) DEFAULT NULL,`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`c_schema` text,PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

该表中id为主键,uk_configinfo_datagrouptenant为联合索引。下面为or使用索引的场景,场景中的联合索引a,b,c分别代表uk_configinfo_datagrouptenant中的data_id,group_id,tenant_id。

#or条件中只要出现了非索引列,将会全表扫描explain select md5 from config_info where id = 1 or md5 = '111'#使用or如果只是单条件只有主键的话,or也是会走主键索引的(该案例同样适用于普通索引(这里的普通索引并非联合索引,联合索引的话只能是使用联合索引中的第一个字段a作为单条件))explain select md5 from config_info where id = 1 or id = 2#主键索引explain select md5 from config_info where data_id = 'application-dev.yml' or data_id = 'application-dev.yml' #联合索引中的a,会使用到aexplain select md5 from config_info where group_id = 'DEFAULT_GROUP' or group_id = 'DEFAULT_GROUP' #联合索引中的b,会进行全表扫描(c也同理)#使用or如果是联合索引的话,即时是联合索引所有的字段都进行条件查询,依旧会进行全表扫描explain select md5 from config_info where id = 1 or data_id = 'application-dev.yml' or group_id = 'DEFAULT_GROUP' or tenant_id = ''#如果or条件使用了联合索引中非首字段进行条件查询,会全表扫描explain select md5 from config_info where id = 1 or group_id = 'DEFAULT_GROUP'#or条件为主键(或者其他普通索引)以及联合索引的首个字段a,会使用到主键索引以及联合索引的aexplain select md5 from config_info where id = 1 or data_id = 'application-dev.yml'

总结:在使用or进行条件连接时,只有所有的条件字段都建立了索引时才会使用索引,否则全表扫描,这个索引包括主键以及联合索引,但是要注意的是,联合索引只能是首个字段作为条件,当使用联合索引中的其他字段作为条件进行or连接时,就会出现全表扫描。

补充:多条件进行or连接时,执行计划的type为“index_merge”,意为索引合并,换句话说就是对多个索引分别进行条件扫描,然后将它们各自的结果进行合并。

explain select md5 from config_info where id = 1 or data_id = 'application-dev.yml'

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。