MYSQL之高性能的mysql--查询性能优化
Posted joker1034
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL之高性能的mysql--查询性能优化相关的知识,希望对你有一定的参考价值。
查询性能优化
为什么查询速度会慢
慢查询基础:优化数据访问
查询性能低下最基本的原因是访问的数据太多.对于低效的查询,我们可以进行以下判断
1.应用程序是否在检索大量超过需要的数据
2.确认mysql服务层是否在分析大量超过需要的数据行
是否向数据库请求了不需要的数据
查询不需要的记录
多表关联时返回全部列
总是取出全部列
重复查询相同的数据
重构查询的方式
一个复杂查询还是多个简单查询
在传统实现中,总是强调数据库完成尽可能多的操作,这样做的逻辑在于以前总是认为网络通信,查询解析和优化是一件代价很高的事情;
但是这样的想法对于mysql并不适用,mysql在连接和断开设计的很轻量,在返回一个小的查询结果方面很高效
Mysql内部每秒能够扫描内存中数百万行数据,相比之下,mysql响应数据给客户端就慢得多,其他情况相同时,减少查询当然更好,但是有时候,将一个大查询分解成多个小查询是有必要的
切分查询
eg 将一个大的delete分成多个小的
分解关联查询
用分解关联查询的方式重构查询有以下优势:
1.让缓存效率更高
2.查询分解后,丹哥查询可以减少锁的竞争
3.应用层做关联,更容易对数据库进行拆分,更容易做高性能和扩展
4.减少冗余记录的查询寻
5.避免嵌套关联
查询执行的基础
MySQL客户端/服务器通信协议
查询状态
Sleep
Query
Locked
Analyzing and statistics
The thread is
Sending data
查询优化处理
重新定义关联表的顺序,将外连接转换内连接,使用等价变换规则,优化count() min() max(),预估并转化为常数表达式,使用覆盖索引扫描,子查询优化,提前终止查询,等值传播,列表in()比较
优化特定类型的查询
优化COUNT()查询
优化关联查询
优化子查询
优化GROUP BY 和DISTINCT
group by 通常使用查找表的标识进行分组效率更高
优化LIMIT分页
当偏移量特别大时,性能有很大影响
1.尽可能利用覆盖索引
2.尽可能转换成已知位置
3.通过主键id能确认更好
优化union
如果一定需要服务器处理重复行,否则一定要带上all, 因为没有all关键字,mysql会给临时表加上distinct选项,导致临时表做唯一性检测
静态查询分析
使用用户自定义变量(以下场景尽量不要使用)
1.使用自定义变量查询,不能使用查询缓存
2.不能再常量或者标识符地方自定义变量,如表名,列名和limit子句
3.如果使用连接池或者持久性连接,自定义变量可能引起bug
4.5.0版本前大写小写敏感
5.不能显式地声明常量类型
6.mysql优化器会在某些场景优化掉变量
7.:=优先级很低
8.使用未定义的比那辆不会有语法错误
9.赋值的顺序和赋值的时间点不固定
避免重复查询刚刚更新的数据
以上是关于MYSQL之高性能的mysql--查询性能优化的主要内容,如果未能解决你的问题,请参考以下文章