码迷,mamicode.com
首页 > 数据库 > 详细

Mysql性能优化二

时间:2019-03-23 20:58:37      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:处理   style   EAP   aml   count   col   str   ima   原理   

建立适当的索引  

1、索引的原理说明   

btree类型的索引,就是使用的二分查找法,肯定快啊,算法复杂度是log2N,也就是说16条数据查4次,32条数据查5次,64条数据查6次....依次类推。使用索引跟没使用索引的区别,就跟我们使用新华字典查字,一个是根据拼音或者笔画查找,一个是从头到尾一页一页翻。

2、索引的代价

  • 磁盘占用

  • 对dml(update delete insert)语句的效率影响

btree 方式检索,算法复杂度: log2N 次数

技术图片

3、哪些列上适合添加索引 

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

select * from emp where empno = 1;
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

select * from emp where sex = 
  • 更新非常频繁的字段不适合创建索引

select * from emp where logincount = 1
  • 不会出现在WHERE子句中的字段不该创建索引

4、索引的类型  

  • 主键索引,主键自动的为主索引 (类型Primary)

  • 唯一索引 (UNIQUE)

  • 普通索引 (INDEX)

  • 全文索引 (FULLTEXT) [适用于MyISAM] ——》sphinx + 中文分词    coreseek [sphinx 的中文版 ]

  • 综合使用=>复合索引

5、四种索引的区别

  • PRIMARY 索引 =》在主键上自动创建

  • UNIQUE 索引=> 只要是UNiQUE 就是Unique索引.(只能在字段内容不重复的情况下,才能创建唯一索引)

  • INDEX 索引=>就是普通索引

  • FULLTEXT => 只在MYISAM 存储引擎支持, 目的是全文索引,在内容系统中用的多, 在全英文网站用多(英文词独立). 中文数据不常用,意义不大,国内全文索引通常使用 sphinx来完成,全文索引只能在 char varchar text字段创建.

  • 使用全文索引,不能使用like语句,这样就不会使用到全文索引了.

6、索引的使用 

下列几种情况下有可能使用到索引:

  • 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。

explain select * from dept where dname=研发部; 会显示使用到了索引myind

explain select * from dept where loc=MsBDpMRX; 不会显示使用到了索引myind
  • 对于使用like的查询,查询如果是  ‘%aaa‘ 不会使用到索引, ‘aaa%‘ 会使用到索引。

explain select * from dept where dname like %研发部; 不会显示使用到了索引myind

explain select * from dept where dname like 研发部%; 会显示使用到了索引myind

下列的表将不使用索引:

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

  • 对于多列索引,不是使用的第一部分,则不会使用索引。

  • like查询是以%开头

  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须‘‘)

select * from dept from dname=1234; //不会使用到索引

select * from dept from dname=1234; //会使用到索引
  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

7、查看索引的使用情况

  • show status like ‘Handler_read%‘

  • handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

  • handler_read_rnd_next:这个值越高,说明查询低效。

常用SQL优化 

1、对于MyISAM:

alter table table_name disable keys;
loading data//insert语句;
alter table table_name enable keys;

2、对于Innodb:

  • 将要导入的数据按照主键排序

  • set unique_checks=0,关闭唯一性校验。

  • set autocommit=0,关闭自动提交。

3、优化group by 语句

默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序;有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

如果想要在含有or的查询语句中利用索引,则or之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引

 select * from 表名 where 条件1=‘‘ or 条件2=tt

explain select * from dept group by dname; =>这时显示 extra: using filesort 说明会进行排序

explain select * from dept group by dname order by null =>这时不含有显示 extra: using filesort 说明不会进行排序

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

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

和下面比较就可以说明问题!!

explain select * from emp left join dept on emp.deptno=dept.deptno;

选择合适的存储引擎    

1、常用的存储引擎

MyISAM:Mysql5.5默认的MySQL存储引擎。如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性要求不是很高。其优势是访问的速度快。

InnoDB:Mysql5.6默认的MySQL存储引擎,提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM,写的处理效率差一些并且会占用更多的磁盘空间。

Memory:数据存在内存中,服务重启时,数据丢失

MyISAM: 在插入数据时,默认放在最后. ,删除数据后,空间不回收.(不支持事务和外键)

InnoDB 支持事务和外键,对应我们程序员说,常用的存储引擎主要是 myisam / innodb / memory,heap 表

如果选用小原则:

  • 1.如果追求速度,不在乎数据是否一直保存,也不考虑事务,请选择 memory 比如存放用户在线状态.

  • 2.如果表的数据要持久保存,应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性要求不是很高。选用MyISAM

  • 3.如果需要数据持久保存,并提供了具有提交、回滚和崩溃恢复能力的事务安全,请选用Innodb

选择合适的数据类型  

1、在精度要求高的应用中,建议使用定点数来存储数值,以保证结果的准确性。能用deciaml就不要用float

create table temp1( t1 float(10,2), t2 decimal(10,2));

insert into temp1 values(1000000.32,1000000,32); 发现 t1 成了 1000000.31 所以有问题.

2、对于存储引擎是MyISAM的数据库,如果经常做删除和修改记录的操作,要定时执行optimize table table_name;功能对表进行碎片整理。

create table temp2( id int) engine=MyISAM;
insert into temp2 values(1); insert into temp2 values(2); insert into temp2 values(3);
insert into temp2 select * from temp2;--复制
delete from temp2 where id=1; --发现该表对应的数据文件没有变小

3、日期类型要根据实际需要选择能够满足应用的最小存储的早期类型

create table bbs(id int ,con varchar(1024) , pub_time int);

date(Ymd,时间-3*24*60*60); 2038年-1-19

 

文章转载自http://www.cnblogs.com/jiekzou/p/5380073.html

Mysql性能优化二

标签:处理   style   EAP   aml   count   col   str   ima   原理   

原文地址:https://www.cnblogs.com/charliedaifu/p/10585493.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!