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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值