2020-12-20

mysql的索引下推理解和实践

对于mysql建表稍有点经验的开发人员都会为后续的where查询条件提前考虑创建索引。

这里说的是在使用索引查询时有关索引下推的有关知识点。

 

综合前人的经验结果:索引下推是数据库检索数据过程中为减少回表次数而做的优化。

判断是否需要回表的是由mysql存储引擎控制,默认从mysql5.6版本开始支持。

 

下面用docker分别创建基于mysql5.5和mysql5.6的容器,表结构保持一致(docker创建mysql容器不做演示)。

 

首先看mysql5.5:

mysql> select version();+-----------+| version() |+-----------+| 5.5.62 |+-----------+1 row in set (0.00 sec)mysql> show create table testhh\G;*************************** 1. row ***************************  Table: testhhCreate Table: CREATE TABLE `testhh` ( `id` int(10) unsigned NOT NULL, `age` int(10) unsigned DEFAULT '0', `name` char(10) NOT NULL DEFAULT '', `height` int(10) NOT NULL DEFAULT '0', `name2` char(10) NOT NULL DEFAULT '', `height2` int(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `age_index` (`age`) USING HASH, KEY `un` (`name`,`height`)) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)ERROR:No query specifiedmysql> explain select * from testhh where name like 'a%' and height = 100\G;*************************** 1. row ***************************   id: 1 select_type: SIMPLE  table: testhh   type: rangepossible_keys: un   key: un  key_len: 14   ref: NULL   rows: 1  Extra: Using where1 row in set (0.00 sec)ERROR:No query specified

上面可见explain的extra字段结果时Using where,表示优化器需要通过索引回表查询数据。

 

再看mysql5.6:

 

mysql> select version();+-----------+| version() |+-----------+| 5.6.50 |+-----------+1 row in set (0.00 sec)mysql> show create table ua\G;*************************** 1. row ***************************  Table: uaCreate Table: CREATE TABLE `ua` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` char(10) NOT NULL DEFAULT '', `height` int(10) NOT NULL DEFAULT '0', `name2` char(10) NOT NULL DEFAULT '', `height2` int(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `nh` (`name`,`height`)) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)ERROR: No query specifiedmysql> explain select * from ua where name like 'a%' and height=10\G;*************************** 1. row ***************************   id: 1 select_type: SIMPLE  table: ua   type: rangepossible_keys: nh   key: nh  key_len: 14   ref: NULL   rows: 1  Extra: Using index condition1 row in set (0.00 sec)ERROR: No query specified

explain的extra字段是Using index condition,表示会先通过条件过滤索引,再通过过滤后的索引查询符合索引条件的数据。









原文转载:http://www.shaoqun.com/a/501437.html

跨境电商:https://www.ikjzd.com/

宝贝格子:https://www.ikjzd.com/w/1322

黑石集团:https://www.ikjzd.com/w/1339.html


对于mysql建表稍有点经验的开发人员都会为后续的where查询条件提前考虑创建索引。这里说的是在使用索引查询时有关索引下推的有关知识点。综合前人的经验结果:索引下推是数据库检索数据过程中为减少回表次数而做的优化。判断是否需要回表的是由mysql存储引擎控制,默认从mysql5.6版本开始支持。下面用docker分别创建基于mysql5.5和mysql5.6的容器,表结构保持一致(docker创建
net-a-porter:net-a-porter
let go:let go
台湾春节期间夜市、西门町商圈等正常营业的吗?:台湾春节期间夜市、西门町商圈等正常营业的吗?
抵达张家界后如何去风景区?:抵达张家界后如何去风景区?
从佛山到番禺南粤苑大概要多久?:从佛山到番禺南粤苑大概要多久?

No comments:

Post a Comment