Mysql索引底层数据结构与算法、Explain

发布时间 2023-03-26 22:55:48作者: 曾鸿发

为什么建议InnoDB表必须建主键?并且推荐使用整型的自增主键?

如果不由我们人工去创建主键,mysql也会帮我们去建立主键,没有必要把这么简单地工作交给Mysql。
整型比较比UUID比较要快,而且更加节省空间。

设置自增有一个考虑就是在插入元素数据的时候由于需要维护一颗B+树,这颗树根据主键排序的,为了维护树平衡,需要一定的时间开销,设置主键自增之后,直接往后面追加元素即可,减少了时间开销。

为什么非主键索引结构叶子节点存储的是主键值?

为了一致性和节省存储空间。

explain extended 可以多展示哪些字段?

filtered,这个和mysql版本有关,有的mysql版本不加extended关键字,也可以展示这个字段。

这是一个半分比的值, rows * filtered / 100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 expalin 中的id值比当前表id值小的表)。

explain partitions可以多展示哪些字段?

partitions, 如果查询基于分区表的话,会显示查询将访问的分区。

怎么查看mysql帮我们做了哪些优化?

在执行完了explain之后,可以使用sho warnings语句查看mysql帮我们执行哪些优化。

explain select_type列的含义?

select_type 表示对应简单还是复杂查询。

1)simple:简单查询,查询不包含子查询和union

2)primary:复杂查询中最外层的select

3)subquery:包含在select中的子查询(不在from 子句中)

4)derived:包含在from子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)

5)union:在union中的第二个和随后的select

explain typ列有什么含义?

这一列表示关联类型,即MySQL决定如何查找表中的行,查找数据记录的最大范围。

依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL。

一般来说,得保证查询达到range级别,最好达到ref。

NULL: mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如: 在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表。

const, system; myq能对查询的某部分进行优化并将其转化成一个常量(可以看show wanings 的结果)。用于 primary key 或 unique key 的有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为system。

eq_ref: primary key 或 unique key 索的所有部分被连接使用,最多只会返回一条符合条件的记录。这可能是在 onst 之外最好的联接类型了简单的 select 查询不会出现这种 type。

ref:相比 e r,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行.