18-mysql优化之索引的增删改以及优化

唯一索引
第一种创建方式:
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语句。
18-mysql优化之索引的增删改以及优化_第1张图片



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;

18-mysql优化之索引的增删改以及优化_第2张图片

你可能感兴趣的:(dataBase)