MYSQL索引

为什么需要索引

  • 索引的顺序性
  • 快速查找、排序、分组
  • 减少扫表数量,避免创建临时表,将随机IO变为顺序IO

B-Tree

  • MySQL的Btree实际上是balance tree基础上做了小改动,每个叶子节点都有一个指向后一个叶子节点的指针。

聚簇索引

  • 聚簇并不是一种单独的索引类型,而是一种存储方式:InnoDB的聚簇索引在同一个结构中保存了B-Tree索引和行数据,索引就是主键。而覆盖索引也是相同的模型。

高性能索引

  • 三星级索引

    • 一星:要查找的记录放在一起
    • 二星:多列索引的顺序与查找条件顺序一致
    • 三星:覆盖索引
  • 选择性

    • 定义:不重复的列数量与所有列数量的比值,最大值为1
    • 对于BLOG、TEXT、长varchar,虽然选择性很高,但mysql不允许如此大的字段,只能使用前缀索引
    • 正常情况下,多列索引应该将选择性高的列放到前面
  • 什么情况下无法使用索引

索引使用案例

SQL分析

  • explain
    • type列:官方的说法,说这列表示的是“访问类型”,更通俗一点就是:mysql找到需要的数据行的方式,由差到好:All(扫全表),index(使用索引扫全表),range(使用索引范围查询),ref(使用索引返回一行数据),const(主键查询)。
    • extra列:Only index:使用到了索引;Where used:使用到了where限制;Using filesort使用了全文排序;Using temporary使用到了临时表。当extra里显示有using filesort或using temporary时,sql的执行就会很吃力,时间就会增加。
    • keys列:使用到的索引
    • rows列:扫描的行数