数据库存储引擎--常见的数据库存储引擎有MyIsAM和InnoDB,相比于MyIsAM存储引擎,InnoDB存储引擎它支持事务和行级锁,所以InnoDB也是目前市场上的主流存储引擎;
以下概念都是基于InnoDB存储引擎:
索引类型:
普通索引--叶子节点存储的是主键值;
聚集索引--叶子节点存储的是行记录;
聚集索引的特点:InnoDB有且只有一个聚集索引;如果定义了PK,则PK字段就是聚集索引;如果未定义PK,则第一个not NULL unique列就是聚集索引;否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
回表查询:
数据库先定位到主键值,再根据主键值定位到行记录,总共需要扫描两边树,SQL_Server官网和MYSQL官网文档指出说扫描一遍索引树就可以获取到所需的列数据是效率最高,所以我们应该避免回表查询;
索引覆盖:
被查询的字段,是建立在联合索引里去,效率高;
举个栗子:先创建单列索引 index( id PK,name )
select id, name from table ;这个SQL会根据索引 name 定位到主键值 id ,再定位到行记录,这就是覆盖索引;
我们可以通过 Explain 关键字查看SQL执行计划,其中 extra 列看这个SQL执行过程是否触发索引覆盖,如果有索引覆盖那么 extra 列结果是“Using index”;
select id, name, sex from table ;这个SQL中的 sex 字段必须通过回表查询才可以拿到行记录,所以效率会较低,如果要覆盖索引,可以将单列索引升级为联合索引,即 index( id PK, name, sex ),这样就成功避免
了回表查询,从而提高了查询效率;
原文:https://www.cnblogs.com/afeng-chen/p/12530135.html