MySQL优化班13期课后作业,20180719

1、你觉得一般索引采用B+树结构,会有什么问题
 2、查询中,主键跟唯一索引哪个更好
3、innodb表用rowid作为聚集索引有什么缺点
 
4、什么是回表,和覆盖索引有什么关系
 
5、InnoDB表如果确实没办法用自增INT做主键的话,有什么次优方案吗
已邀请:

aaron8219 - Oracle DBA

赞同来自:

1. B+树基于B树(平衡多叉树),适用于大量数据的读写操作,由于B+树需要把所有的键值都存储在叶子节点,因此会占用较多的pagespace,另外B+树也同B树一样需要自旋来达到平衡,这种也是会消耗资源的。

2. 不一定,看场景,通常情况来说是利用主键索引进行查询效率高一些,因为主键包含了所有列的值,可以避免回表。但当查询列都能被包含在唯一索引(覆盖索引)中时,同样也可以避免回表,而此时只需要更少的indexpage被读入内存,效率应该更高一些。

3. 由于innodb表是索引组织表,有且只能有一个聚集索引,当采用rowid作为聚集索引,则说明该表没有显式主键,也没有非空唯一键,那么首先这个表的查询性能就会很差,其次如果是有主从复制的场景下,没有主键会导致从库回放SQL的时候全表扫面,很容易产生大量的延迟。另外,rowid是实例级别的资源,如果每个库中都有大量的rowid作为聚集索引的表,那么也是对资源的一种消耗,可能还会产生冲突。

4. 回表就是当我们的查询列不能从索引中直接得到,需要通过二级索引(非聚集索引)先找到主键,然后再通过主键定位到表里的行,取出相应的记录,这个过程就叫做回表。如果可以避免回表操作,即通过索引就可以获取到全部的查询字段,那么我们就把这个索引叫做覆盖索引。

5. 一般最佳实践是希望主键采用与业务无关的自增int或bigint,但如果表确实没有办法满足,那么可以考虑找一个最不容易被频繁更新的列作为主键,但最好也是int类型并且是自增的,如:订单ID。虽然有一定的业务关联性(可能根据一定规则去更新订单号),但至少对性能影响也还是可以接受的,不建议使用字符串类型的列作为主键。
 

要回复问题请先登录注册