mysql中索引是对数据库表中一列或多列的值进行排序的一种结构。

MySQL数据库索引种类

  • 主键索引。数据列不允许重复,不允许为NULL.一个表只能有一个主键
  • 唯一索引。数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
  • 普通索引。基本的索引类型,没有唯一性的限制,允许为NULL值。
  • 全文索引。

索引使用的规则

  • 索引的列是出现在where子句中的列,或者连接子句中指定的列
  • 数量较少的列,没有必要在此列建立索引。
  • 使用短索引。如果对长字符串列进行索引,指定一个前缀长度,能够节省大量索引空间。
  • 不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构。
  • 最左前缀
    顾名思义,就是最左优先。在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

索引实现算法

  • B树
    B树实现的索引可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量.
  • Hash
    Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。

in 和exists

mysql中的in语句是把外表和内表作连接,而exists语句是对外表作循环,每次循环再对内表进行查询。

  • 如果查询两个表大小相当,那么用in和exists差别不大。
  • 如果两个表大小差距较大,则子查询表大的用exists,子查询表小的用in。
  • not in 和not exists,查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。