Mysql 索引

  索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
  索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。


Mysql 索引的类型

普通索引

最基本的索引,它没有任何限制,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。

主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,也可以用 ALTER 命令。记住:一个表只能有一个主键。

全文索引

全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;
他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,
或是随后使用ALTER TABLE 或CREATE INDEX被添加。

单列索引, 多列索引

多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

组合索引(最左原则)

对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。例如:
假设存在组合索引 it1c1c2(c1,c2),查询语句 select * from t1 where c1=1 and c2=2 能够使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。但是,查询语句select * from t1 where c2=2不能够使用该索引,因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。
=in 查询时, 使用所有可以无视顺序位置

挑选索引

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序 使用 使用
返回某范围内的数据 使用 不使用
一个或极少不同值 不使用 不使用
小数目的不同值 使用 不使用
大数目的不同值 不使用 使用
频繁更新的列 不使用 使用
外键列 使用 使用
主键列 使用 使用
频繁修改索引列 不使用 使用

注意项

  • 索引不会包含有NULL值的列
  • 使用短索引, 短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
  • 索引列排序 MySQL查询只使用一个索引,如果where子句中已经使用了索引,那么order by中的列是不会使用索引的。
  • like语句操作 不鼓励使用like操作,如果非使用不可,like "%aaa%" 不会使用索引而 like "aaa%" 可以使用索引。
  • 不要在列上进行运算 这将导致索引失效而进行全表扫描

Finally

  • MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。
  • 理论上每张表里面最多可创建16个索引
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么要使用索引 索引是 MySQL 中一种十分重要的数据库对象。它是数据库性能调优技术的基础,常用于实现数据的快...
    小波同学阅读 297评论 0 2
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 3,031评论 0 8
  • 说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据...
    爱情小傻蛋阅读 704评论 2 2
  • 本文的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的...
    Java架构_师阅读 193评论 0 0
  • 我喜欢这种完全把控自己的生活节奏的感觉,虽然只是片刻的。 细雨绵绵,长发飘飘,移动的脚步,微汗的身体,清新喜欢的感...
    燃心桃桃阅读 262评论 0 2