文章目录
前言
如果表里数据不多的话,就无所谓优化啦,优化前后差别不大;一旦表中的数据上了规模,查询慢的情况应该就经常发生啦.这也是我们要解决的,最大的问题.
查询慢的原因
- 网络
- CPU
- IO
- 上下文切换
n多个任务并发执行,就会有上下文切换,比较浪费时间 - 系统调用
- 生成统计信息
show profile,performance_schema等 - 锁等待时间
并发场景下,锁会非常复杂 (读写锁,行表锁)
优化数据访问
减少访问数据量(扫描行)
查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,我们可以通过减少访问数据量的方式进行优化:
如果查询的数据量很大,可能就不走索引,而是走filesort,因为MySQL认为数据量大时走索引效率很低
- 确认应用程序是否在检索大量超过需要的数据
- 确认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=