MySQL索引优化

1.索引数据结构二叉树,红黑树,Hash,B+树
2.千万级数据表如何用索引快速查找
3.如何基于索引B+树精准建立高性能索引
4.联合索引底层数据结构又是什么样的
5.MySQL索引优化最佳实践
什么是索引?
索引是帮助MySQL高效获取数据的排好序数据结构
MySQL索引优化
我们索引以及数据表中的数据存储位置在哪里?

在我们的磁盘上:sql的data文件夹下。
MySQL索引优化
数据库的存储引擎:MyISAM存贮引擎,InnoDB存贮引擎

问题:存储引擎是形容数据库的还是形容数据库表的?

存储引擎是形容我们数据表的。
MySQL索引优化
MyISAM搜索引擎
MySQL索引优化
MySQL索引优化

InnoDB索引的实现:

  • 表数据文件本身就是按B+Tree组织的一个索引结构文件
  • 聚集索引-叶节点包含了完整的数据记录
    什么是聚集索引(索引和数据在一起的是聚集索引),想MyISAM的话是分在两个表中所以不是聚集索引。
  • 面试题:为什么InnoDB表必须有主键,并且推荐使用整形的自增主键?
    1.为什么必须有主键因为InnoDB它是一个以主键进行B+树数据结构存储的。如果自己没建立主键,InooDB在后台会找一个可以代表这张表的唯一标识(没有重复)来作为主键索引来管理数据,最后MySQL如果没有找到这样的唯一标识,他会自动给你生成一列唯一的数据,来帮助我们维护B+树的结果。
    2.为什么使用自增整形作为主键,有些公司使用UUID,生成为主键,我们知道如果存在字符串相比较,我们需要参照ASCII表来做对比,而是是一个一个往后坐对比。例:qwer123和qwer124是需要比较到最后一位才知道大小,效率没有直接两个整形做对比效率快,包括从存贮大小方面整形也有更大的优势因为索引是在磁盘是的越小可存放的数量也就越多。
  • 为什么非主键索引结构叶子节点存储的是主键值?
    一致性和节省存储空间
    MySQL索引优化
  • 为什么不使用hash表和B树做索引呢?
    实际上MySQL对哈希冲突解决的特别好,并且即使数据量特别大的情况下我们依然可以对索引进行hash运算得到相对应的下标获取内容,既然这么快99.9%公司不使用呢?因为以hash表为索引结构不能解决范围查询。同时B树如果进行范围查询是需要不断的反复到根节点然后在查询(效率很低)。
  • 我们选择B+树作为我们MySQL储存索引数据结构,为什么就可以解决范围查询?
    MySQL索引优化

InnoDB存贮引擎

MySQL索引优化
MySQL索引优化

InnoDB不像MyISAM,数据是直接附着在索引下的,不需要再次回到MYD中。

联合索引的底层储存结构长什么样?

MySQL索引优化