sql效率优化

查找分析查询慢的原因:

记录慢查询日志

设置方法
方法一:全局变量设置
将 slow_query_log 全局变量设置为“ON”状态

mysql> set global slow_query_log='ON'; 

设置慢查询日志存放的位置

mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';

查询超过1秒就记录

mysql> set global long_query_time=1;

方法二:配置文件设置
修改配置文件my.cnf,在[mysqld]下的下方加入

[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

3.重启MySQL服务

service mysqld restart

4.查看设置后的参数

复制代码

mysql> show variables like 'slow_query%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| slow_query_log      | ON                             |
| slow_query_log_file | /usr/local/mysql/data/slow.log |
+---------------------+--------------------------------+

mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+

复制代码

四、测试

1.执行一条慢查询SQL语句

mysql> select sleep(2);

2.查看是否生成慢查询日志

ls /usr/local/mysql/data/slow.log

如果日志存在,MySQL开启慢查询设置成功!

 

 

2.set profiling=1;分析单条语句,看看为啥慢

查看时间花费在了什么地方

show profile for query 1;

 

 

3.开始优化

查询不需要的记录,使用limit解决

多表关联返回全部列,指定A.id,A.name,B.age

总是取出全部列,SELECT*会让优化器无法完成索引覆盖扫描的优化

把大的查询分为多个小的相同的查询

一次性删除1000万条要比一次删除一万条,暂停一会的方案更加损耗服务器开销。

可以将一条关联分解成多条sql来执行,让缓存效率更高,执行单个查询可以减少锁的竞争

在应用层做关联可以更容易对数据库进行拆分

 

优化count()查询

count(*)中的*会忽略所有的列,直接统计所有列数,因此不要使用count(列名)

MyISAM中,没有任何where条件的count(*)非常快

当有where时,MyISAM的统计不一定比其他引擎快

可以增加汇总表

对汇总信息做缓存

 

优化关联查询

确认ON获取USING子句列上有没有索引,确认GROUP BY 和ORDER BY中只有一个表的列,这样MySQL才有可能使用索引

 

优化子查询

尽可能使用关联查询来替代

 

优化GROUP BY和DISTINCT这两种查询均可使用索引来优化,是最有效的方法

关联查询中,使用标识列进行分组效率更高。

如果不需要ORDER BY,进行GROUP BY时使用ORDER BY NULL,MySQL不会再进行文件排序。

 

优化LIMIT分页

LIMIT偏移量大的时候,查询效率较低

可以查询上次查询的最大ID,下次查询时直接根据该ID来查询。

 

UNION查询优化

UNION ALL效率大于UNION

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值