索引下推 回表-爱代码爱编程
mysql 5.6之后引入的一个特性,索引下推通过减少回表的次数来提高数据库的查询效率
;
回表就是索引中找到了数据id,然后回表去拿到所有数据,再比对另一个过滤条件。
所谓的索引下推,就是在搜索引擎中提前判断对应的搜索条件是否满足,满足了再去回表,通过减少回表次数进而提高查询效率;
如果使用组合索引,就可以利用覆盖索引避免回表操作
如果主键自增,并达到最大,会怎么样。
- 如果是insert语句,会报唯一键冲突的错误。
- 如果是insert on duplicate key update,所有insert on duplicate key update语句的update操作都会执行到id为该字段数据类型的最大值的记录上。
- 如果是insert ignore,会返回rows affected = 0。
InnoDB
InnoDB是MySQL数据库的默认引擎,我们需要了解它的一个重要概念:聚簇索引。InnoDB按照每张表的主键构造一棵B+树,主键对应的索引就是聚簇索引,在每个叶子节点存放着数据表的行数据。所以主键对于InnoDB来说至关重要。
InnoDB对聚簇索引的处理
1、第一种情况:用户定义了主键,那么InnoDB会使用主键作为聚簇索引;
2、第二种情况:用户没有定义主键,那么InnoDB会使用第一个非空的唯一索引作为聚簇索引;
3、第三种情况:用户既没有定义主键,也没有定义唯一索引,那么InnoDB会自动生成一个不可见的ROW_ID的列名为GEN_CLUST_INDEX的聚簇索引,该列是一个6字节的自增数值,随着插入而自增。
影响
很明显,缺少主键的表,InnoDB会内置一列用于聚簇索引来组织数据。而没有建立主键的话就没法通过主键来进行索引,查询的时候都是全表扫描,小数据量没问题,大数据量就会出现性能问题。
而且不设置主键不单单影响到查询,在进行写操作的时候,由于ROW_ID是共享的,这意味着插入的时候需要共享该序列,那么高并发插入的时候为了保持唯一性就避免不了锁的竞争,进而影响性能。
总结
由以上分析可以推论,在建表的时候无论如何都要设置主键,如何没有可用作主键的字段,可以设计一个业务无关的字段,比如xx_id。