mysql中SQL优化

1.如何获取有性能问题的 SQL

1.通过用户反馈获取存在性能问题的 SQL

2.通过慢查日志获取存在性能问题的 SQL

3.实时获取存在性能问题的 SQL


2.使用慢查询日志获取有性能问题的 SQL

slow_query_log 启动停止记录慢查日志

slow_ query_log_file 指定慢査日志的存储路径及文件

long_ query-time 指定记录慢查日志 SQL 执行时间的伐值

log_ queries_ not_using_indexes 是否记录未使用索引的 SQL


慢查询日志配置

https://www.cnblogs.com/saneri/p/6656161.html

默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启,如下所示:

show variables like '%slow_query_log%';

set global slow_query_log=1;

show variables like '%slow_query_log%';

修改my.cnf文件,增加或修改参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器

slow_query_log =1

slow_query_log_file=/usr/local/mysql/data/localhost-slow.log

系统变量log-queries-not-using-indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。

系统变量log_slow_admin_statements表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记入慢查询日志

3.SQL 查询优化

常用的慢查日志分析工具( pt-query- digest

pt-query-digest

-- explain h=127.0.0.1, u=root, p=p@swORd

long-mysqllog

pt-query-digest --explain h=127.0.0.1,u=root,p=root123465 DEVAPP01-slow.log

4.查询速度为什么会慢

1.客户端发送 SQL 请求给服务器

2.服务器检查是否可以在查询缓存中命中该 SQL

3.服务器端进行 SQL 解析,预处理,再由优化器生成对应的执行计划

4.跟据执行计划,调用存储引擎 API 来査询数据

5.将结果返回给客户端

这就是 MQL 服务器处理查询请求的整个过程


5.查询缓存对 SQL 性能的影响

对于一个读写频繁的系统使用查询缓存很可能会降低查询处理的效率所以在这种情况下建议大家不要使用查询缓存

query_cache_type 这个系统变量控制着查询缓存工能的开启的关闭。

query_cache_type=0 时表示关闭,1时表示打开,2表示只要select 中明确指定SQL_CACHE才缓存。

最好的关闭查询缓存的办法就是把my.cnf 中的query_cache_type=0然后再重启mysql

查询缓存相关的系统变量:

  have_query_cache  表示这个mysql版本是否支持查询缓存。

  query_cache_limit   表示单个结果集所被允许缓存的最大值。

  query_cache_min_res_unit  每个被缓存的结果集要占用的最小内存。

  query_cache_size  用于查询缓存的内存大小。


如何监控查询缓存的命中率: 

  Qcache_free_memory  查询缓存目前剩余空间大小。

  Qcache_hits          查询缓存的命中次数。

  Qcache_inserts      查询缓存插入的次数。

  也就是说缓存的命中率为 Qcache_hits/(Qcache_hits+Qcache_inserts)

查询缓存对 SQL 性能的影响

query_cache_type                    设置查询缓存是否可用   OFF

query_cache_size                      设置查询缓存的内存大小   0

query_cache_limit                    设置查询缓存可用存储的最大值

query_cache_lock invalidate      设置数据表被锁后是否返回缓存中的数据

query_cache_min_res_unit        设置查询缓存分配的内存块最小单位

如何确定查询处理各个阶段所消耗的时间

使用 profile

set profiling =1;

执行查询

show profiles

show profile for query N;

查询的每个阶段所消耗的时间

show profile for query 1;


show profile cpu for query 1;

如何确定查询处理各个阶段所消耗的时间

使用 profile

set profiling =1;

执行查询

show profiles;

show profile for query N;


5.performance_schema使用

https://yq.aliyun.com/articles/415550

show variables 'performance_schema';

查看是否支持performance_schema

mysql> select * from information_schema.engines where engine ='performance_schema';



6.如何修改大表的表结构

pt-online-schema-change

--alter="MODIFY C VARCHAR(50) NOT NULL DEFAULT''"

--user=root--password=PassWord D=imooc, t=sbtest4

--charset=utf8 --execute




将后面的转化成上面的--alter


7.数据库分片

oneProxy 安装和使用

https://blog.csdn.net/xxq929604980/article/details/79581222

你可能感兴趣的:(mysql中SQL优化)