背景:
查询优化基础:
查询的生命周期大致可以按照顺序如下来看:从客户端、服务器、然后在服务器上解析,生成执行计划,执行,并将返回结果给客户端。其中执行是生命周期中最重要的阶段。
Mysql查看慢查询的指标:
响应时间:服务时间和排队时间,服务时间是指数据库处理这个查询花了多少时间,排队时间是指服务器因为等待某些资源而没有真正执行查询的时间,可能是I/O时间,也可能是等待行锁等待。
扫描的行数:理想情况下扫描的行数和返回的行数是相同的,但是实际上扫描的行数与返回的行数的比率非常小,在1:1到10:1之间。
返回的行数:
大查询变成小查询:
切分查询:将一个Delete语句分成多个小的执行语句:
分解关联查询:
很多高性能的应用都会使用关联查询进行分解:可以对每个表进行单表查询,然后将结果在应用程序中进行关联。
例子:select * from tage join tage_post on tag_post.tag_id = tag.id
join post on tag_post.post_id = post.id where tag.tag='mysql';
可以改变成:
select * from tag where tag = 'mysql';
select * from tag_post where tag_id = 1234;
select * from post where post.id in (123,456,567,9999);
优势:让缓存的效率更高,将查询分解后,执行单个查询可以减少锁的竞争,在应用层做关联,可以更容易的对数据库进行拆分,更容易做到高性能和可扩展。
使用In()代替关联查询可以让mysql安装ID顺序进行查询,这比随机关联要高效。
Mysql执行的基础
1.客户端先发送一条查询给服务器
2.服务器先检查缓存,如果命中了缓存,则立刻返回缓存的结果,否则进入下一阶段
3.服务器进行sql解析,预处理,再由优化器生成对应的执行计划
4.mysql根据执行计划,调用存储引擎的api来执行查询
5.将结果返回客户端