数据库索引的使用

使用场景:

  1. WHERE
  2. JOIN ON
  3. ORDER BY:由于索引本身是有序的,直接按顺序读取。如未建索引将使用外部排序(将数据从硬盘分批读取到内存使用内部排序,最后合并排序结果),影响性能。

使用原则:

  1. 索引覆盖:select后尽量指定字段,被索引覆盖到的字段无需回表读取,从而提高效率
  2. 索引列尽量小:磁盘块大小固定,节点元素(数据项或者关键码)占用空间越小,元素越多,树的高度越低)
  3. 最左前缀匹配原则:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如建立(a,b,c,d)顺序的索引,使用(a=1 and b=2 and c>3 and d=4)检索条件,d将用不到索引。=和in可以乱序,比如建立(a,b,c)顺序的索引,使用(a=1 and b=2 and c=3)检索条件可以任意顺序,查询优化器会优化成索引可以识别的形式。
  4. 索引列区分度要高:主键区分度最高,区分度不高的例如性别字段,一次可能匹配出大量数据
  5. 索引列不参与计算:比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’)。
  6. 索引列NOT NULL只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
  7. 其它:
    1. 通配符放在前面无法使用索引
    2. 更新频繁字段不适合创建索引
    3. 定义有外键的数据列一定要建立索引
    4. 对于定义为text、image和bit的数据类型的列不要建立索引

索引类型:

  1. 主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键
  2. 唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引
  3. 普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值
  4. 全文索引:是目前搜索引擎使用的一种关键技术

 

聚簇索引和非聚簇索引

聚簇索引:是一种数据存储方式,InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,这篇文章最开始介绍的也是聚集索引

非聚簇索引:将数据和索引分开,查找时需要先查找到索引,然后通过索引回表找到相应的数据

你可能感兴趣的:(Mysql)