MySQL(五)查询优化

前言

如果表里数据不多的话,就无所谓优化啦,优化前后差别不大;一旦表中的数据上了规模,查询慢的情况应该就经常发生啦.这也是我们要解决的,最大的问题.

查询慢的原因

  • 网络
  • CPU
  • IO
  • 上下文切换
    n多个任务并发执行,就会有上下文切换,比较浪费时间
  • 系统调用
  • 生成统计信息
    show profile,performance_schema等
  • 锁等待时间
    并发场景下,锁会非常复杂 (读写锁,行表锁)

优化数据访问

减少访问数据量(扫描行)

查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,我们可以通过减少访问数据量的方式进行优化:

如果查询的数据量很大,可能就不走索引,而是走filesort,因为MySQL认为数据量大时走索引效率很低

  1. 确认应用程序是否在检索大量超过需要的数据
  2. 确认mysql服务器层是否在分析大量超过需要的数据行
    举例,分页时,看一下执行计划,大概扫了多少行数据:
-- 常见的分页,查看执行计划,rows几乎是全表扫描了一遍;
-- 得出结论:如果limit需要跳过的行很多,MySQL会进行全表扫描
explain select * from rental limit 1000000,5;

-- 可以用子查询优化(这两种差距倒不是很大,但是也是一种优化手段了;数据量越大,越明显):
select a.* from rental a inner join (select rental_id from rental limit 1000000,5) b on a.rental_id = b.rental_id ;

是否向数据库请求了不需要的数据

  • 查询不需要的记录
    我们常常会误以为mysql会只返回需要的数据,实际上mysql却是先返回全部结果再进行计算,在日常的开发习惯中,经常是先用select语句查询大量的结果,然后获取前面的N行后关闭结果集。
    优化方式是在查询后面添加limit
  • 多表关联时返回全部列
select * from actor inner join film_actor using(actor_id) inner join film using(film_id) where film.title=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值