一文读懂MySql的效率倍增器——索引

码农读史 2017-11-19 08:48:05

一文读懂MySql的效率倍增器——索引

在MySql中使用索引(index),尤其是容量很大的表,可以大大提高查询效率。下面我们就认识一下MySql中的效率倍增器:索引。

一、使用索引的场景

一般来说,在WHERE和JOIN中出现的列需要建立索引。

MySQL对<,<=,=,>,>=,BETWEEN,IN,以及LIKE的部分情况下使用索引。

二、使用索用的时机

1、查询条件里有不等号 != ,MySQL将无法使用索引。

2、查询条件里使用了函数,MySQL也将无法使用索引。

3、在JOIN操作中,MySQL只有在主键和外键的数据类型相同时才能使用索引。

4、使用比较操作符LIKE和REGEXP,MySQL只有在第1个字符不是通配符的情况下才能使用索引。比如LIKE ‘abc%’,MySQL将使用索引;如果LIKE ‘%abc’,MySQL将不使用索引。

5、在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。

6、如果某个数据列里包含许多重复的值,不宜建立索引。例如“性别”,数据列里包含的净是些诸如”0/1″或”Y/N”等低基数值。

7、不对过长的VARCHAR字段建立索引。

8、定义为text和image和bit数据类型的列不应该建立索引。

9、当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引。

三,使用索引的缺点

事物都有两面,索引一样遵循这个规律。

1、每次更新数据记录,如对表进行insert、update和delete,索引就刷新一次。许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入或修改一条记录之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。

2、索引还会在硬盘上占用相当大的空间。如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。所以索引不是越多越好,应该只为最经常查询和最经常排序的数据列建立索引。如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。

---------------------------------------------------------------------------------------

一文读懂MySql的效率倍增器——索引

在实际操作中,使用索引必须了解以下的知识:

一、索引名称规范

  • 非唯一索引按照“idx_字段名称[_字段名称]”进用行命名。例如idx_age_name。

  • 唯一索引按照“uniq_字段名称[_字段名称]”进用行命名。例如uniq_age_name。

  • 组合索引建议包含所有字段名,过长的字段名可以采用缩写形式。例如idx_age_name_add。

二、索引类型

  1. 普通索引

    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

  2. 唯一索引

    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:

    一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;

    二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在 某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。许多时候,建立唯一索引的目的是为了避免插入重复值。因为唯一索引允许为空,所以空值也只能有一条记录。事实上,我们不宜将数据设为空值,而是null。

  3. 主键索引

    是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。主键索引在定义时使用的关键字是 PRIMARY而不是UNIQUE。

  4. 组合索引

    指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循“最左前缀”集合,简单的理解就是只从最左面的开始组合。

    比如说,INDEX(A, B, C)可以当做(A),(A, B)的索引来使用,但不能当做(B)、(C)或(B, C)或(A、C)的索引来使用。

  5. 全文索引(FULL TEXT)

    如果查询文本字段时,使用where column like '%xxxx%' ,这样做会让索引失效,这个时候全文索引就起到作用了。全文索引配合match against操作使用,而不是一般的where语句加like。目前char、varchar,text 列上可以创建全文索引。

    值得一提的是,在数据量较大时候,先将数据放入表中然后再创建全文索引,比起先建立全文索引然后再写入数据的,前者的速度会快很多。

三、索引方式

  • Innodb和MyISAM默认的索引是Btree索引.

  • Mermory默认的索引是Hash索引。

四、索引的创建、删除和查看

1.ALTER TABLE

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。

2.CREATE INDEX

CREATE INDEX可对表增加普通索引或UNIQUE索引。

CREATE INDEX index_name ON table_name (column_list)

CREATE UNIQUE INDEX index_name ON table_name (column_list)

table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。注意,CREATE INDEX语句不可创建主键(PRIMARY KEY)索引。

3、删除索引

可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理。

DROP INDEX index_name ON talbe_name

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY

4、查看索引

mysql> show index from tblname;

mysql> show keys from tblname;

一文读懂MySql的效率倍增器——索引

结语:不同的创建、如何正确的创建出高效的索引,尽可能的提高查询速度,压榨出程序的最大性能,是每个码农孜孜以求的事情。当然关于索引的知识和技巧不仅只有这些,需要我们平时在工作和学习中不断积累。

猜你喜欢

转载自blog.csdn.net/u011277123/article/details/78859690