mysql索引种类及常见索引生效情况

一、什么是索引

索引就好比我们书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。

二、索引的优缺点

1、 优点

  • 建立索引的列可以保证行的唯一性,生成唯一的rowId
  • 建立索引可以有效缩短数据的检索时间
  • 建立索引可以加快表与表之间的连接
  • 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序

2、缺点

  •  创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
  • 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
  • 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

三、索引建立的原则

1、总的来说就是数据量大的,经常进行查询操作的表要建立索引

2、表中字段建立索引应该遵循几个原则

1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存中都需要更少的空间,处理起来更快。

2)  简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂,处理起来也更耗时。

3)  尽量避免NULL:应该指定列为NOT NULL。含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

4)  对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义,所以索引的建立应当更多的选取唯一性更高的字段。

 

四、mysql索引种类

1、主键索引(PRIMARY KEY)

唯一,不允许为空,建立的规则是 int优于varchar,一般在建表的时候创建立,一般会设为 int 而且是 AUTO_INCREMENT自增类型。

2、唯一索引(UNIQUE INDEX)

索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。创建示例:

CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(`account`);

3、普通索引(ORDINARY INDEX)

这是最基本的索引,它没有任何限制。创建示例:

 CREATE INDEX account_Index ON `award`(`account`);

或 ALTER TABLE award ADD INDEX account_Index(`account`)

4、全文索引(FULLTEXT INDEX)

在mysql中fulltext 索引只针对 myisam生效,所以全文不常用到

5、组合索引(UNION INDEX)

多个普通索引组合在一起,在使用查询的时候遵循mysql组合索引的"最左前缀",

CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...)

如果你建立了 组合索引(nickname_account_createdTime_Index) 那么他实际包含的是3个索引 (nickname) (nickname,account)(nickname,account,created_time)

五、mysql索引失效情况

1、like右模糊匹配索引生效,左模糊不生效,如 name like '李%' 索引有效,name like '%李%' 索引无效

2、多列组合索引范围查询的列之后的列的索引不生效

3、 判断空时候要用is null,用“=null”不走索引

4、group by分组不会使用索引

5、使用or时候,所有条件列都必须加上索引,只要一个不加索引都不生效

你可能感兴趣的:(MySQL)