详解MySQL数据库的Index Condition Pushdown(ICP)特性
副标题[/!--empirenews.page--]
概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解。 一、Index_Condition_Pushdown Index Condition Pushdown (ICP)是MySQL用索引去表里取数据的一种优化。如果禁用ICP,引擎层会穿过索引在基表中寻找数据行,然后返回给MySQL Server层,再去为这些数据行进行WHERE后的条件的过滤。 ICP启用,如果部分WHERE条件能使用索引中的字段,MySQL Server 会把这部分下推到引擎层。存储引擎通过使用索引条目,然后推索引条件进行评估,使用这个索引把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数。总之是 ICP的优化在引擎层就能够过滤掉大量的数据,这样无疑能够减少了对base table和mysql server的访问次数。 ICP的优化用于range, ref, eq_ref, and ref_or_null访问方法,当这些需要访问全表的行。这个策略可以用于INNODB和MyISAM表。 二、实验 先从一个简单的实验开始直观认识ICP的作用。 1、导入示例数据 这里使用Employees Sample Database,作为示例数据库。 ![]() 将下载的压缩包解压后,会看到一系列的文件,其中employees.sql就是导入数据的命令文件。执行
![]() 就可以完成建库、建表和load数据等一系列操作。此时数据库中会多一个叫做employees的数据库。库中的表如下:
![]() 下面将使用employees表做实验。 2、建立联合索引 employees表包含雇员的基本信息,表结构如下:
![]() 这个表默认只有一个主索引,因为ICP只能作用于二级索引,所以我们建立一个二级索引:
这样就建立了一个first_name和last_name的联合索引。 ![]() 3、查询(ICP启用) 为了明确看到查询性能,启用profiling并关闭query cache:
![]() 然后看下面这个查询:
![]() 根据MySQL索引的前缀匹配原则,两者对索引的使用是一致的,即只有first_name采用索引,last_name由于使用了模糊前缀,没法使用索引进行匹配。我将查询联系执行三次,结果如下:
![]() 查看执行计划
![]() 4、查询(ICP禁用) 关闭ICP:
![]() (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |