mysql数据库索引有哪几种类型?最左前缀原则及索引算法有哪些区别?

2018-09-2011:08:31数据库教程Comments4,285 views字数 1708阅读模式

索引是对数据库表中一列或多列的值进行排序的一种结构。一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系,为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

主键索引: 数据列不允许重复,不允许为NULL.一个表只能有一个主键。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

全文索引: 是目前搜索引擎使用的一种关键技术。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

最左前缀文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

  • 顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
  • 还有一个就是生效原则 比如
index(a,b,c)
where a=3	只使用了a
where a=3 and b=5	使用了a,b
where a=3 and b=5 and c=4	使用了a,b,c
where b=3 or where c=4	没有使用索引
where a=3 and c=4	仅使用了a
where a=3 and b>10 and c=7	使用了a,b
where a=3 and b like '%xx%' and c=7	使用了a,b
复制代码

索引算法有 BTree Hash文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

BTree是最常用的mysql数据库索引算法,也是mysql默认的算法。因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量, 例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

select * from user where name like 'jack%'; 
如果一通配符开头,或者没有使用常量,则不会使用索引,例如: 
select * from user where name like '%jack'; 
复制代码

Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

BTree索引是最常用的mysql数据库索引算法,也是mysql默认的算法。因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符 例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

只要它的查询条件是一个不以通配符开头的常量
select * from user where name like 'jack%'; 
如果一通配符开头,或者没有使用常量,则不会使用索引,例如: 
select * from user where name like '%jack'; 
复制代码

Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

索引设计的原则?

  1. 适合索引的列是出现在where子句中的列,或者连接子句中指定的列
  2. 基数较小的类,索引效果较差,没有必要在此列建立索引
  3. 使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
  4. 不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

作者:codeyuyu
链接:https://juejin.im/post/5ba1f32ee51d450e805b43f2
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/5180.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/5180.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定