4.mysql索引

41 阅读2分钟

索引模型

  • 哈希表
  • 有序数组
  • 搜索树

有序数组

有序数组适合查询,每一条数据都已经排好序。不适合增加操作,后边的记录都要移动,成本太高。

n叉树和二叉树哪个好?

二叉树不适合大量的数据,查询起来太慢了。

n叉树查找一个值只需要访问3次硬盘,树的第二层在内存中,访问磁盘的平均次数就减少了。

主键查询优于其他查询

基于非主键索引的查询需要多扫描一颗索引树。

回表查询

主键索引叶子结点存的整行数据,如果查询条件是非索引字段,就会在二级索引树中找到ID的值,在通过ID的值到主键索引树中搜索一次,发生回表过程。

页分裂和页合并操作

如果在叶子节点中间插入数据,原来的数据页已经满了,需要一个新的数据页,挪动数据过去,利用率是50%,这就是页分裂。

相邻的而两个页由于删除了数据,利用率很低,会将数据页合并,这就是页合并。

主键自增和业务字段

自增主键好,因为每次添加数据都是在树中追加,不移动叶子节点。而且主键ID占用的字节小。

如何避免回表

二级索引树查询的结果是主键的值,就不需要再去主键索引查找,这是覆盖索引。

最左前缀原则

先建立一个联合索引,比如(name,age)这两个字段作为联合索引,下面举几个例子:

  • 查询条件name字段,符合最左原则
  • 查询条件name,age字段,符合最左原则
  • 查询age字段,不符合最左原则

索引下推

最左前缀查找数据,要经过回表查询,找到数据后在判断条件是否符合,效率低。

为了节省回表次数,直接在索引表内部进行条件判断,符合条件的再回表查询,效率高。