MySql常见性能查询、调优语句和慢sql
- MySql常见性能查询、调优语句
-- 查询慢查询次数 show status LIKE 'slow_queries'; -- 查看慢查询 show variables LIKE 'long_query_time'; -- --设置慢查询时间 setlong_query_time=1; -- 开启慢日志 set GLOBAL_slow_query_log=ON; -- 使用explain来分析sql语句实现优化 EXPLAIN 具体sql语句; -- 查看当前服务器配置的最大连接数 show variables LIKE 'max_connection'; -- 查看当前已使用最大连接数 show GLOBAL status like '%max_used_connections%' -- 设置最大连接数 set GLOBAL MAX_CONNECTIONS=10000;
-- 查询是否有锁
show OPEN TABLES where In_use > 0;
- 慢sql的原因
1、查询的表--没加索引
查询的条件字段没有索引,导致全表扫描。这种在数据量比较少时,如低于十万级不会觉得慢,但当表中数据量达到或超过十万级时,就会体现出来,查询时间特别慢
2、查询的索引,无效
查询条件没有索引字段。
查询条件使用or,选择式过滤条件,导致索引无效
查询条件使用Like,且从头部开始模糊匹配,致索引无效
查询条件不满足复合索引的最左匹配原则,致索引无效
查询条件,索引列使用了隐藏类型转换,致索引无效
查询条件,索引列使用了算术运算+、- 、...致索引无效
查询条件,索引列使用了逻辑运算(!=、<>、is null、is not null)致索引无效
3、查询使用了--临时表
临时表可能不用,但是回表查询(一次查询不满足 就把这些结果存在临时表,还需要利用查询结果再查一次)
4、join或子查询太多
有些场景复杂,关联的表越多,时间自然就越长;一般关联不建议超过3个,且数据量小的表放左边,大的放右边。
5、查询结果数据量太大
第1种你直查的表数据量太大,千万级。即使那了索引,索引文件也会很大,深度很深,查询就会慢。解决方法分表分区。
第2种联表笛卡尔积量太大。解决方法explain进行sql分析优化
6、锁竞争
现在Mysql的表一般都是InnoDB存储引擎,该引擎是行锁,每次锁定一行。若一个事务在操作一行数据,会锁定该行数据,其它事务直到前一个事务操作完成才能操作该行数据;若多个事务等待时,前一事务结束,等待的事务就会竞争抢锁,sql性能就会很慢了
7、limit分页--太深
查询需要偏移一定量数据时,一般会用Limit,偏移量大时sql执行会很慢。因为偏移量会分页读取到buffpool中,数据量大,占用的空间大,而这个空间大小是配置的,一般不会很大,所以,导致了慢sql
8、配置参数--不合理
数据库中有些非常重要的参数,例多很带有buff、cache、size、length、max、min、limit等字样的配置参数。都是直接关系数据库性能的。若都是默认值,硬件条件再好性能也发挥不了作用。
9、频繁刷脏页
脏页,是内存数据页和磁盘数据页不一致。一般发数据更新操作中。更新数据,要先把数据读取出来然后再内存中更新,最后生成日志文件,再放日志文件,实现表数据更新。若数据量大,buffpool写满或者后续生成的日志文件 写满,都会导致这个操作过程变慢。
解决方法:建议少批量修改,多次提交
10、系统资源--不够用
数据库是用来存储数据,频繁进行磁盘操作,所以要选择磁盘IO性能比较好的机器作为数据库服务。
数据库还要经常进行数据交换,所以要有足够的内存。
mysql安装在操作系统中,所以也受操作系统限制