MySQL Index Condition Pushdown Optimization

比如数据库中有如下表:

show create table people\G
*************************** 1. row ***************************
       Table: people
Create Table: CREATE TABLE `people` (
  `zipcode` varchar(16) NOT NULL,
  `lastname` varchar(32) NOT NULL,
  `address` varchar(32) NOT NULL,
  KEY `idx_people_zipcode_lastname_address` (`zipcode`,`lastname`,`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.001 sec)

我们执行如下查询:

SELECT * FROM people
  WHERE zipcode='95054'
  AND lastname LIKE '%etrunia%'
  AND address LIKE '%Main Street%';

如果没有 index condition pushdown optimization 的话,那么执行步骤如下:

  1. 对比 idx_people_zipcode_lastname_address 索引中 zipcode 是否能匹配,如果可以匹配,获取整个数据行;
  2. 对比 WHERE 中的条件,看是否可以全部匹配;

而有了 index condition pushdown optimization 之后,步骤则变成了:

  1. 对比 idx_people_zipcode_lastname_address 索引中的 zipcode 是否能匹配,同时对比 WHERE 语句中,index中包含的部分,看是否可以通过;
  2. 如果可以通过,获取整个数据行;
  3. 对比 WHERE 中的条件,看是否可以全部匹配;

这两者的区别就在于,是否充分利用了索引中的值,提前进行了数据的过滤。我们在 EXPLAIN 的时候,如果当前数据库查询使用了这项优化,则会在 Extra 那一列显示 Using index condition


ref:


微信公众号
关注公众号,获得及时更新

更多文章
  • 密码技术简明教程(一):对称加密和非对称加密
  • Kubernetes 笔记
  • go mod 和 logrus 路径大小写的问题
  • Flask自动加载Blueprint
  • 在KVM里安装Minikube
  • 搞定面试中的系统设计题
  • Crontab + Sendmail实现定时任务并且通知
  • Nginx设置Referer来防止盗图
  • Graphviz dot简明教程
  • jQuery简明教程
  • Python RQ(Redis Queue)添加gevent支持
  • 读《超级运营术》- 如何做社区?
  • 技术人,光有技术是不行的
  • 搭建aria2服务器
  • 使用shairport-sync搭建airplay音频服务器