Mysql—索引原理与详解

索引的原理

索引的优点和缺点和使用原则

索引优点:

可以加快数据的检索速度,提高查询速度。
所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引。
全文检索字段进行搜索优化。
索引缺点:

创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
当对表中的数据进行增加、删除、修改的时候,索引也需要动态维护,降低了数据的维护速度。
索引也需要占用物理存储空间(数据库目录:/var/lib/mysql)。
我们知道数据表中的数据也会有最大上线设置的,如果有大量的索引,索引文件可能会比数据文件更快达到上线值。
使用原则:

索引不是越多越好,并不是每个字段都设置索引就好,而是需要自己合理的使用。
对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,不要对经常变动的数据加索引。
数据量小的表最好不要使用索引,因为数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可以建立索引。
什么时候添加索引:

在 where、order by 子句中经常使用的字段。
字段的值是多个(例如性别字段则不适合)。
字段内容不是经常变化的,经常变化的字段,添加索引反而降低性能。
不宜过多添加索引,每添加一条索引都会占用磁盘空间。
索引的分类

普通索引:加速查找
唯一索引:加速查找+约束 (唯一)
主键索引:加速查找+约束(不为空且唯一)
外键索引:
组合索引:primary key(id,name):联合主键索引,unique(id,name):联合唯一索引,index(id,name):联合普通索引
全文索引:用于搜索很长一篇文章的时候,效果最好。(full text)
空间索引:了解就好,几乎不用。(spatial)
普通索引(index)

复制代码
使用规则
1.一个表中可以有多个index字段
2.字段的值可以有重复,也可以为null值。字段值无约束
3.经常把做查询条件的字段设置为index字段
4.index字段的key标志为:mul

创建普通索引(有三种方法)
方法1:创建表时创建索引index
create table student(
id int,
name varchar(25),
score float(5,2),
index(name), # 创建name索引
index(score) # 创建score索引
);
方法2:创建表后创建索引index:索引名一般和字段名一样,只要自己能认出就行,可以随便起名。
mysql> create index 索引名 on 表名(字段名)
mysql> create index name on student(name);
方法3:创建表后创建索引index
mysql> alter table 表名 add index 索引名(字段名);
mysql> alter table student add index(name);
mysql> alter table student add index name6(name);

查看普通索引:key一列就是索引的列,我们会发现在name和score有值MUL。
mysql> desc 表名;
mysql> desc student; # Key标志为:MUL
mysql> show index from 表名; # Key_name值为索引名
mysql> show index from student\G; # 如果字段名过多,就添加一个\G。

删除普通索引:删除普通索引只能一个一个删除
mysql> drop index 索引名 on 表名;
mysql> drop index name6 on student;
复制代码
唯一索引(unique)

复制代码
使用规则
1.一个表中可以有多个unique字段
2.unique字段的值不允许重复,可以为空值null
3.unique的key标志是UNI

创建唯一索引(基本等同index创建)
方法1:创建表时创建索引
create table student(
id int,
name varchar(25),
score float(5,2),
unique(name),
unique(score)
);
方法2:创建表后创建索引:索引名一般和字段名一样,只要自己能认出就行,可以随便起名。
mysql> create unique index 索引名 on 表名(字段名);
方法3:创建表后创建索引
mysql> alter table student add unique(name);
mysql> alter table student add unique name6(name);
mysql> alter table student add unique index(name);
mysql> alter table student add unique index name6(name);

查看唯一索引
mysql> desc 表名;
mysql> show index from 表名;

删除唯一索引
mysql> drop index 索引名 on 表名;

猜你喜欢

转载自blog.51cto.com/14549989/2439753