MySQL索引条件下推,能提升千万数据性能273%,是何奥秘?🔍
- 内容介绍
- 文章标签
- 相关推荐
MySQL的索引优化一直是个让人又爱又恨的话题。爱的是它能让你的查询飞起来恨的是——妈的, 出道即巅峰。 调优起来比写代码还费脑子。
索引条件下推,到底是个啥玩意儿?
索引条件下推是MySQL 5.6之后才有的一个优化功能。简单说 它就是把一些查询条件“推”到了存储引擎层去判断,而不是像以前那样, 总结一下。 先从存储引擎里把数据捞出来再让server层慢慢过滤。这玩意儿能减少回表的次数,从而大大减少IO开销。

举个例子, 比如你查一个学生表,where条件是age = 18 and student_name like 'c%'如果没开ICP,MySQL会先把age=18的记录都捞出来然后在server层再判断student_name是不是以c开头。但如果你开了ICP, MySQL就会在存储引擎层就直接判断student_name是不是满足条件,不满足的直接跳过不回表,省下一大波性能,换言之...。
ICP到底能提升多少性能?
我们来点实际的,别整虚的。我这里测试了1900万条数据,没开ICP的时候,查询一次要5.039秒,开了之后只要1.339秒。 地道。 你算一下 / 1.339 = 276%。也就是说性能直接提升了276%!
嗯,就这么回事儿。 这可不是我瞎编的,是实打实的数字。你要是不信,自己去跑个大数据量的查询试试,看看是不是这个效果。
ICP的原理, 其实没那么玄乎
MySQL的架构是分层的,server层和存储引擎层是分开的。以前的查询逻辑是server层发个请求,存储引擎层把数据捞出来然后server层再慢慢过滤。但ICP的牛逼之处就在于, 它把一些过滤条件直接下推到存储引擎层,让引擎自己先判断,不满足的直接pass,省得来回折腾,何必呢?。
比如你查student_name like 'c%' 这个条件其实可以在二级索引里就判断,根本没必要回表。
MySQL的索引优化一直是个让人又爱又恨的话题。爱的是它能让你的查询飞起来恨的是——妈的, 出道即巅峰。 调优起来比写代码还费脑子。
索引条件下推,到底是个啥玩意儿?
索引条件下推是MySQL 5.6之后才有的一个优化功能。简单说 它就是把一些查询条件“推”到了存储引擎层去判断,而不是像以前那样, 总结一下。 先从存储引擎里把数据捞出来再让server层慢慢过滤。这玩意儿能减少回表的次数,从而大大减少IO开销。

举个例子, 比如你查一个学生表,where条件是age = 18 and student_name like 'c%'如果没开ICP,MySQL会先把age=18的记录都捞出来然后在server层再判断student_name是不是以c开头。但如果你开了ICP, MySQL就会在存储引擎层就直接判断student_name是不是满足条件,不满足的直接跳过不回表,省下一大波性能,换言之...。
ICP到底能提升多少性能?
我们来点实际的,别整虚的。我这里测试了1900万条数据,没开ICP的时候,查询一次要5.039秒,开了之后只要1.339秒。 地道。 你算一下 / 1.339 = 276%。也就是说性能直接提升了276%!
嗯,就这么回事儿。 这可不是我瞎编的,是实打实的数字。你要是不信,自己去跑个大数据量的查询试试,看看是不是这个效果。
ICP的原理, 其实没那么玄乎
MySQL的架构是分层的,server层和存储引擎层是分开的。以前的查询逻辑是server层发个请求,存储引擎层把数据捞出来然后server层再慢慢过滤。但ICP的牛逼之处就在于, 它把一些过滤条件直接下推到存储引擎层,让引擎自己先判断,不满足的直接pass,省得来回折腾,何必呢?。
比如你查student_name like 'c%' 这个条件其实可以在二级索引里就判断,根本没必要回表。

