MYSQL查询性能优化一

一,慢查询原因
是否向数据库请求了不需要的数据
1,查询不需要的记录,mysql服务器会查询出全部的结果集,客户端也会接受全部数据,然后抛弃大部分数据,解决方法使用limit.
2.多表关联查询时返回所有的列
例如:select * from A left join B on A.id = B.id;
优化后:select A.* from A left join B on A.id = B.id;
3.使用select * 查询全部的列
4.重复查询相同的数据
Mysql是否在扫描额外的记录-查询开销指标如下:
1.响应时间(服务时间和排队时间)
2.扫描的行数,扫描行数越少越好
3.返回的行数,
4.扫描行数和访问类型,EXPLAIN中type列反映了访问类型,访问类型有全表扫描,索引扫描,范围,唯一索引,常数引用等。
5.如果发现查询需要扫描大量的数据但是只返回少数的行,可以优化技巧如下:
1)使用索引覆盖扫描,吧所有需要用到的列放到索引中,这样存储引擎无需回表获取对应的行就可以返回结果
2)改变库表结构
3)重写这个复杂的查询,让优化器来优化查询。
重构查询方式
1.用多个简单查询替代复杂查询,因为mysql现在的连接和断开都是轻量级的,开销小。
2。切分查询:将大查询分割为小的查询
若用一个大的语句一次性的完成查询,则一次需要锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞很多小的重要的查询,但分解为小的查询,则尽可能小的影响mysql性能,同时还减少mysql复制的延迟。
例如:删除旧数据例子
DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH);
优化后:
rows_affected = 0;
do{
rows_affected = do_query(“DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH) limit 10000”)
}while rows_affected >0
3.分解关联查询,可以对每一个表进行一次单表查询,然后在应用程序进行关联
分解查询优点:
1)让缓存的效率更高,应用程序可以方便的缓存单表查询结果。
2)执行单个查询减少锁竞争
3)在应用层关联,更容易对数据库进行拆分,可高扩展和高性能
4)查询本身效率提升,用IN替代关联查询
5)减少冗余记录的查询
6)相当于在应用中实现了哈希关联,而不是在mysql的嵌套循环关联,效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值