MySQL-索引

  • 索引的作用?
    • 索引大大减少了服务器需要扫描的数据量(一定是因为有序)
    • 索引可以帮助服务器避免排序和临时表(说的是覆盖索引)
    • 索引可以将随机I/O变为顺序I/O
  • B树和B+树区别,为什么选择B+树作为索引?
    B树是一种平衡的多路查找树,一棵m阶的B树满足下列特性:
    • 树中每个结点至多有m棵子树
    • 若根结点不是叶子结点,则至少有两颗子树
    • 除根之外所有非终端结点至少有m/2棵子树
    • 所有的非终端结点中包含下列信息数据
      (n,A0, K1, A1, K2, A2,...,Kn, An)
      其中Ki(升序)为关键字;Ai为指向子树根结点的指针,且A(i-1)所指子树中所有结点的关键字均小于Ki,Ai所指子树中所有结点的关键字均大于Ki;n为关键字的个数
    • 所有的叶子结点都出现在同一层次上,并且不带信息
      B+树与B树的差异在于:
    • 有n棵子树的结点含有n个关键字
    • 所有叶子结点包含全部关键字信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接
    • 所有非终端结点可以看成索引部分,结点中仅含有其子树中的最大(或最小)关键字
  • 数据存储在哪? 索引存储在哪?
    索引实在存储引擎层而不是服务层实现的.//todo
  • 多列同时作为联合索引时,作用顺序是什么?
    MySQL只能高效地使用最左前缀列.以下的情形会对索引的作用产生影响
    • 如果不是按照索引的最左列开始寻找,则无法使用索引
    • 不能跳过索引中的列
    • 如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引优化查找
      想像一下单指针在B+树的搜索过程,就比较容易理解上面的情况.
  • 覆盖索引是什么?聚簇索引是什么?
    聚簇索引是一种数据的存储方式.它的数据行实际上存放在索引的叶子页(leaf page)中.术语聚簇表示数据行和相邻的键值紧凑地存储在一起.因为无法同时把数据行存放在不同的地方,所以一个表只有一个聚簇索引.
    优点://todo 补充解释
  • 可以把相关的数据保存在一起
  • 数据访问更快
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值.
    缺点:
  • 如果数据全部都放内存,访问的顺序没那么重要,聚簇索引就没什么优势了.
  • 插入速度严重依赖于插入顺序
  • 更新聚簇索引列的代价很高
  • 可能面临页分裂(page split)的问题
  • 可能导致全表扫描变慢,尤其是行比较稀疏
  • 二级索引可能比想象的要更大,因为在二级索引的叶子结点包含了引用行的主键列.(因为叶子结点中是主键,要获取行信息需要二次查找)
  • 主键和唯一约束是不是索引,有什么不同?

你可能感兴趣的:(MySQL-索引)