MySQL索引(六)

1、什么是索引

  索引就像一本书的目录同样,若是在字段上创建索引,那么以索引为列的查询条件时能够加快查询的速度,这个就是MySQL优化的重要部分mysql

2、建立主键索引

  整个表的每一条记录的主键值在表内都是惟一的,用来惟一标识一条记录sql

  查询数据库,按主键查询是最快的,每一个表只能有一个主键列,可是能够有多个普通索引列。主键列要求列的全部内容必须惟一,而普通索引列不要求内容必须惟一数据库

  不管创建主键索引仍是普通的索引,都要在表的对应列上建立,能够对单列建立索引,也能够对多列建立索引缓存

建立主键索引的方法(在建立表的时候)--PRI
create table test1(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id), 			# 主键索引
key index_name(name)                      
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


查看主键索引
show index from test;

为建立好的表用sql添加主键(基本上不用)
alter table test change id id int primary key auto_increment;

PS:若是主键索引有auto_increment自增参数是不能删除索引的,在工做中主键索引也不可能删除

3、建立普通索引

建立普通索引(建立完表随时会加)--MUL
在建立表的时候
create table test2(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id), 				
key index_name(name)          # 普通索引            
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看索引
show index from test1;

删除普通索引
alter table test1 drop index index_name;
drop index index_name on test1;

建立表后增长普通索引
alter table test1 add index index_name(name);


PS:添加索引的时间取决于表中的数据的大小

4、建立联合索引

  一张表的一个字段惟一值很少的状况下,但愿建立一个惟一值更少的索引,因此就能够把多个字段联合起来建立索引(字段越多建立联合索引,惟一值就越少)bash

在建立表的时候加上联合索引
create table test3(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id), 				
key index_name(name),
key index_name_dept(name,dept)  # 联合索引                    
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

建立联合索引
create index index_name_dept on test(name,dept);
alter table test add index index_name_dept(name,dept);

对字段的前n个字符建立联合索引
create index index_name_dept on test(name(8),dept(10));
alter table test add index index_name_dept(name(8),dept(10));

删除联合索引
alter table test drop index index_name_dept;
drop index index_name_dept on test;

主键也能够建立联合索引
create table test4(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id,age),            # 主键的联合索引				
key index_name(name),
key index_name_dept(name,dept)  # 联合索引                    
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


PS:创建索引的原则:咱们尽可能在惟一值多的大表上创建索引

PS:联合索引的前缀特性
  index(a,b,c)仅a,ab,abc三个查询条件会走索引
  尽可能把最经常使用的做为查询条件的列,放在第一的位置优化

5、建立惟一索引(非主键)

建立非主键的惟一索引(至关于和主键相似)--UNI 能够为空
create unique index uni_index_name on test(name);

删除索引
alter table test drop index uni_index_name;
drop index uni_index_name on test;

查看索引
show index from test;

6、给字段的前n个字符建立索引

  当一个字段的内容的前N个字符已经接近惟一的时候,咱们能够对前n个字符建立索引,这样能够节省建立索引的空间,以及下降读取金和更新维护索引消耗的系统资源spa

建立前n个字符的索引
create index index_dept on test(dept(8));
alter table test add index index_dept(dept(8));

删除索引
alter table test drop index index_dept;
drop index index_dept on test;

查看索引
show index from test;

7、关于索引的问题

既然索引能够加快查询的速度,那么就能够给全部的列加上索引吧?
由于索引不但占用系统空间,并且更新数据时还须要维护索引数据,所以索引是双刃剑,并非越多越好,如:数十到几百行的小表上无需建立索引,更新频繁,读取比较少的表要少建索引

须要在哪些列上建立索引呢?
select user from mysql.user where host='' 索引必定要建立在where后的条件列上,若是是连表查询要建立在链接的列上,而不是建立在select后选择数据的列上,另外咱们要尽可能选择在惟一值多的大表上的列建立索引

8、索引的总结

建立索引的基本知识小结:
一、 索引相似书籍的目录,会加快查询数据的速度。
二、 要在表的列(字段)上建立索引。
三、 索引会加快查询速度,可是也会会影响更新的速度,由于更新要维护索引数据。
四、 索引列并非越多越好,要在频繁查询的表语句where后的条件列上建立索引。
五、 小表或重复值不少的列上能够不建索引,要在大表以及重复值少的条件列上建立索引.
六、 多个列联合索引有前缀生效特性。
七、 当字段内容前N个字符己经接近惟一时,能够对字段的前N个字符建立索引。
八、 索引从工做方式区分,有主键,惟一,普通索引。
九、 索引类型会有BTREE (默认)和hash (适合作缓存(内存数据库)等
相关文章
相关标签/搜索