MySQL索引的创建、删除及优缺点

1.索引是什么:

  索引就像一本书的目录,你想去找“鲁迅的《从百草园到三味书屋》”:直接在目录中找到这篇文章是325页,然后直接翻到325页。如果没有索引,你必须从第一页开始,一页一页的找,直到325页的时候才能找到。浪费时间和精力(有这时间去打一把王者荣耀了!!)。
  

2.索引包括:

索引包括单列索引组合索引

  单列索引(主键索引,唯一索引,普通索引):一个索引只包含一个列。
  组合索引:一个索引两个或两个以上的列。

3.索引的操作:

案例用到的表:

create table user(

id int not null auto_increment primary key comment “id”,

name varchar(30) not null default “”comment “用户名”,

nickname varchar(30) not null default “”comment “昵称”,

height float(5.2) not null default 0.00 comment “体重”

);

1.创建索引:

(1). 单列索引:

(a).普通索引:

方法一:
语法:create index 索引名 on 表名 (字段名(length));
例子:create index name_index on user (name);

方法二:
语法:alter table 表名 add index 索引名(字段名(length));
例子:alter table user add index name_index(name);

注意:
如果是char,varchar类型,length可以不写实际长度,如果是blob和text类型就必须指定长度。

(b).唯一索引:

所有列的值必须唯一,但是可以为空

方法一:
语法:create unique index 索引名 on 表名(字段名(length));
例子:create unique index nickname_unique_index on user(nickname);

方法二:
语法:alter table 表名 add unique 索引名(字段名(length));
例子:alter table user add unique nickname_unique_index(nickname);

(c).主键索引:

不允许有空值

主键索引建立的规则是 int优于varchar。
一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.
一般会设为 int 而且是 AUTO_INCREMENT自增类型的

(2).组合索引:

一个表中含有多个单列索引不代表是组合索引。
通俗一点讲 组合索引是:包含多个字段但是只有一个索引名称。

语法:create index 索引名 on 表名(字段名1(length),字段名2(length));
例子:create index name_height_index on user(name,height);

(3).全文索引:

文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定.

如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column like ‘%xxx%’ 这样做会让索引失效。

创建方法:
语法:alter table 表名 add fillindex(字段名1,字段名2);
例子:alter table user add fillindex(name,nickname);


使用方法:
select * from user
where match(name, nickname) against(‘xxx′, ‘sss′, ‘ddd′);

这条命令将把name和nickname字段里有xxx、sss和ddd的数据记录全部查询出来。

2.删除索引:

语法:drop index 索引名 on 表名;
例子:drop index name_index on user;

3.查看索引:

语法:show index 索引名 on 表名;
例子:show index name_index on user;

4.索引的优点:

1、大大加快数据的检索速度,这也是创建索引的最主要的原因

2、创建唯一性索引,保证数据库表中每一行数据的唯一性;

3、加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

4、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

5、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

5.索引的缺点:

1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

2、索引会一定的物理空间

3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

注意:有索引的列增删改的速度比没索引的要慢得多。(比如:你要把《西游记》放到书架里,没有索引直接随便放一个书架就可以了,速度很快;但是有索引的时候,你需要依次找到:文学–>古典文学–>中国古典文学…一直到四大名著,然后把《西游记》放进去,速度慢的多。)

6.不推荐创建索引的情况

1、查询操作很少的列,不要创建索引,否则会降低MySQL的性能和增大物理空间。

2、数据很少的列,不要创建索引,比如:性别只有男和女。

3、定义为text和image和bit数据类型的列不要增加索引。

7.使用索引注意事项

1、在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间。 (单独order by 用不了索引,但可以考虑加where 或加limit)。

2、关于like语句
  如果你对name字段建立了一个索引.当查询的时候的语句是 name like ‘%ABC%’ 那么这个索引将不会起到作用。但是name like ‘ABC%’ 就可以用到索引。

3、索引不会包含NULL列,一般需要给默认值0或者 ’ ‘字符串:
  如果列中包含NULL值,此列将不会被包含在索引中;组合索引中如果有一列含有NULL值那么这个组合索引将失效。

4、使用短索引:
  如果你的一个字段是Char(30)或者int(30),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.

5、不要在列上进行运算,这样会使得mysql索引失效。

6、选择越数据类型越好,
  因为通常越小的数据类型在磁盘,内存,cpu,缓存中 占用的空间越少,处理起来越快。

你可能感兴趣的:(mysql)