index-merge、index-condition-pushdown

192 阅读2分钟

  在mysql 5.0 对于单个表只能使用一个索引,比如 select * from emp where a = 1 or b = 2,在a和b上都有索引,那么没有推出index-merge之前,只能选择a或者b索引,有了index-merge后,可以同时使用多个索引查找结果,然后将这些结果进行操作返回,操作根据where中条件的不同而不同,如果是and则将结果进行交集计算,毕竟两个条件都要满足,如果是or操作,则进行并集计算。

index-condition-pushdown 索引下推在mysql5.6推出,主要原理就是在非聚簇索引查询时,在找到符合条件的记录时,如果记录包含where中的条件,就先判断一下是否满足where中的条件,如果不满足就跳过这行,相比于不使用icp,减少了回表查询的次数,能提高一部分性能。 下面使用一个例子来解释索引下推,例子取自《mysql45讲》, 首先建立一个表

CREATE TABLE `tuser` (
  `id` int(11) NOT NULL,
  `id_card` varchar(32) DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `ismale` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id_card` (`id_card`),
  KEY `name_age` (`name`,`age`)
) ENGINE=InnoDB

然后我们在查询一个语句:select * from tuser where name like 张% and age = 10; 首先这个查询用到了name_age这个联合索引,因为使用了%所以联合索引只能使用name这一列做判断,在没有索引下推时,对于每一个以张开头的name,都要根据主键id去回表查询整行记录,然后判断age是否等于10,有了索引下推以后,在回表之前,就判断一下age 是否等于10,如果不等于直接放弃这行,继续查找下一个符合规定的行。