mysql性能优化
如何发现有问题的SQL?
使用MySQL慢差日志对有效率问题的SQL进行监控
下面就是与慢查询相关的sql语句:
show variables like ‘show_query_log‘ //用这个看一下是否开启了慢查日志
show variables like ‘%log%‘;//关于sql的所有参数
以61数据库为例
set global show_query_log_file = ‘/home/mysql/sql_log/mysql-slow.log‘ //指慢查询文件的存储位置
set global log_queries_not_using_indexes = on; //我们是否将没有使用索引的sql记录到慢查询日志中,通常情况下对数据库优化过程中主要是优化表的索引和查询的使用方式,这样记录下来sql以备以后进行优化
set global long_query_time =1;//超过多少秒之后的记录在慢查询日志中,大于1秒的查0.01秒一般
慢查日志的分析工具
mysqldumpslow
pt-query-digest
使用explain查询sql的执行计划
type:从最好到最差
const:表示常数查找,一般是主键或者唯一索引进行查找
eq_reg:表示范围查找一般是主键或者唯一索引进行查找
ref:常用于连接的查询中,在一个表中基于某个表的查找
range:索引的范围查找
index:索引的扫描
ALL:表扫描
注:key_len:索引的长度越小越好,因为mysql的读取都是以页为单位的,而一页中如果存取的索引越大,那他的查询效率就越高
举几个例子
以上这个语句可以看出是全表扫描,这样数据量特别大的时候,而且查询频率特别高的时候,那这个sqlio性能就特别的高,就会拖慢着整个服务器的io效率,就增加了服务器不稳定的因素,通常这种情况下就可以在payment_date字段上增加索引,然后再看一下执行计划
select tables optimized away 意思是并不是进行实际的查询,通过索引就可以知道sql的执行结果了,因为索引是顺序排列的,通过统计最后一条数据的值是什么样子的,也就是不需要表的操作就可以直接知道,这样就优化了sql的执行效率,减少了io操作,其实这个索引就可以称为覆盖索引,意思就是通过索引信息就可以查询到语句的结果
我是想差2006和2007年分别的电影熟,现在是合在一起了,所以是错误的,
正确的写法
说到count,通常我们用count(*) 或者 count(字段名) 这两种方式,哪这两种方式到底哪种好呢,举个例子
就是count(*)是包含为null的行数
count(id)不包括
利用count的特性如果说发行年份是2006就给它计数,如果不是2006就返回null值,而这个null值在count中是不会计数的,
原文地址:https://www.cnblogs.com/weiluoyan/p/8184400.html