• 什么是索引
    MySql官方对索引的定义为:索引是帮助MySql高效获取数据的数据结构,所以索引的本质就是:索引是数据结构。

  • 索引的优势
    提高数据检索的效率,减低数据库的IO成本。(检索查询快) 减低数据排序的成本,减低了CPU的消耗。(排序快)

  • 索引的劣势
    写操作速度会变慢(insert/update/delete) 占用磁盘空间(索引存放的地方)

  • 哪些情况需要创建索引, 哪些情况不要创建索引? https://blog.nowcoder.net/n/753e988d4f4f4654997c740cd86b2347

  • 索引的基本原理 图片说明

  • MySQL支持哪几种类型的索引?

  • 从数据结构角度有四种
    1、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理
    2、hash索引:
    a)仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询
    b)其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引
    c)只有Memory存储引擎显示支持hash索引
    3、FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)
    4、R-Tree索引(用于对GIS数据类型创建SPATIAL索引)
    参考:https://www.cnblogs.com/yuan-shuai/p/3225417.html

  • 从物理存储角度
    1、聚集索引(clustered index)
    2、非聚集索引(non-clustered index)

  • 从逻辑角度
    1、主键索引:主键索引是一种特殊的唯一索引,不允许有空值
    2、普通索引或者单列索引
    3、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合
    4、唯一索引或者非唯一索引
    5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

  • B+树索引和哈希索引的优劣对比 图片说明 图片说明 图片说明 图片说明

  • 索引的设计原则 图片说明

  • mysql聚簇索引和非聚簇索引的区别 图片说明 图片说明

  • InnoDB和MyISAM的区别

  • 区别:

  1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
  2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
  3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
  • 如何选择:
  1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
  2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB
  3. 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB;
  4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你不知道用什么存储引擎,那就用InnoDB,至少不会差。