唯一索引
第一种创建方式:
create  table ddd(id int primary key auto_increment,name varchar(32) unique);


uqnique字段可以为null,并且可以有多个,''可以插入,但是不允许重复
主键索引不能为null,也不能重复。

第二种创建方式:

在创建表之后,再去创建唯一索引



create table eee(id int primary key auto_increment,name varchar(32));


create unique index 索引名 on 表名(列名)


create unique index my_uni on eee(name);




删除索引


alter table 表名 drop index 索引名;


alter table eee drop index my_uni;




删除主键索引


alter table 表名 drop primary key;




alter table eee drop primary key;//不能有auto increment




修改索引




先删除,然后重新创建索引。



索引使用的注意事项



索引的代价

1.占用磁盘空间

2.对dml操作有影响,变慢



在哪些列上面适合添加索引?

1.在较为频繁的作为查询条件字段应该创建索引

   select * from emp where empno=1;

唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

select * from emp where sex ='男'



更新频繁的字段不适合创建索引

select * from emp where logincount=1;



不会出现在where 子句中字段不该创建索引。



总结:满足以下条件的字段,才应该创建索引。

a:肯定在where 条件中经常使用的字段

b:该字段的内容并不是唯一的几个值(sex就是唯一的几个)

c:字段内容不是频繁变化的









使用索引的注意事项:

说明:如果我们的表中有复合索引(一个索引作用在多列上),此时我们注意:

创建复合索引

alter  table dept add index myind(dname,loc);//dname表示左边的列,loc就是右边的列

1.对于创建的多列索引,只要查询条件使用了最左边的列(dname),索引一般就会被使用

select * from dept where loc='aaa';//这样就不会使用到索引。
 select * from dept where dname='aaa';//这样就 会使用到索引



explain  可以帮助我们在不真正执行某个sql语句的时候,就可以分析sql语句。

mysql更改索引 mysql修改唯一索引语句_字段





2.对于使用like的查询语句,查询如果是‘%aaa’不会使用到索引

‘aaaa%’ 会使用到索引

比如:

explain  select * from dept where dname like '%aaaa'\G

就使用不到索引

如果非要查%aaa这样的记录,要使用全文索引



在like查询的时候,like '关键字',最前面,不能使用%或者_这样的字符,

如果一定要前面有变化的值,则考虑使用全文索引---->sphinx中文索引。



3.如果条件中有or,即使其中有条件带索引也不会使用。

即如果你的sql语句中有or,那么or两边的字段都必须建立索引,才能使用到索引。

例如:

explain select * from dept where dname like 'aaaa' or dage=23;

这个sql语句中dname如果创建了索引,而dage没有创建索引,则索引不起作用。

explain select * from dept where dname like 'aa' or did=123;

这个sql语句中,因为两个字段都建立了索引,所以索引起作用。

4.如果列类型是字符串,那一定要在条件中就爱那个数据使用引号引用起来,

否则不使用索引。(添加时,数据必须‘’起来)

举例:

    select * from dept where dname=111;不使用索引

select * from dept where dname='111';使用索引

5.如果mysql估计使用全表扫描Type=all的时候,就不会使用索引。







如何查看索引使用的情况

show status like 'Handler_read%';

如果这个值越高,说明索引使用率越好。

handle_read_key越高越好

handle_read_rnd_next越低越好





sql语句的小技巧

1.在使用group by 分组查询时,默认分组后,还会排序,可能会降低速度

举例:

select * from dept group by deptnanme;会使用using filesort排序

select * from dept group by deptnanme  order by null;

增加一个order by null就可以防止排序。



2.有些情况下,可以使用连接代替子查询,因为使用join,MySQL不需要再内存中创建临时表。

select * from dept,emp where dept.deptno=emp.deptno;







如何选择mysql的存储引擎



myisam 存储:如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储。

比如bbs中的发帖表,回复表。



innodb存储:对事务要求高,保存的数据都是重要数据、我们建议使用innodb,比如订单表。

帐户表。



memory存储:比如我们数据变化非常频繁,不需要入库,同时又频繁的查询和修改。







MyISAM不支持外键,INNODB支持外键



insert .....select  叫做蠕虫复制


myisam的碎片整理

如果数据库引擎是myisam,一定要进行碎片整理。

因为数据库中的文件,即使你把数据库记录删除了,文件大小还是在的。


整理方法:

optimize table test100;

mysql更改索引 mysql修改唯一索引语句_字段_02