赞
踩
这里引用深入Mysql实战
简单来说,优化的目的是为了提高资源的利用率,让资源充分发挥价值。常见场景下,一台服务器有四大资源:cup、内存网络和磁盘,一旦其中某个资源出现问题,整个服务器提供服务的能力就会变差,优化的最终目的是为了同时满足更多用户的的在线需求
Mysql 优化的目标主要有三个:
下面是我对sql优化的一些总结,如有错误欢迎指出来
sql查询时使用limit减少查询返回的数据
减少插入情况下交互次数(如下)
批量插入语句:
insert into test (id,name) values(1,'张山')
insert into test (id,name) values(2,'李四')
insert into test (id,name) values(3,'王五')
可改写成如下形式:
insert into test (id,name) values(1,'张山'),(2,'李四'),(3,'王五')
为什么要对子查询进行优化:
第一点:执行子查询时,MySQL 需要为内层查询语句的查询结果建立一个临时表 ,然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表 。这样会消耗过多的 CPU 和 IO 资源,产生大量的慢查询。
第二点:子查询的结果集存储的临时表,不论是内存临时表还是磁盘临时表都 不会存在索引 ,所以查询性能会受到一定的影响;对于返回结果集比较大的子查询,其对查询性能的影响也就越大。
优化方案Join替代
如下sql:
select * from test where id in (select test1_id from test2)
改写成:
select * from test t1 left join test2 t2 on t1.id = t2.test1_id
为什么要对Limit进行优化:
当数据库有10w条数据,此时我要查出最后10条就得 limit 99990,10此时Mysql排序出前99990条记录后仅仅需要返回最后10条记录,前99990条记录造成额外的代价消耗
优化方案一使用覆盖索引,记录直接从索引中获得,效率最高,但是这种情况只适合查询字段比较少的情况(毕竟你也不可能给所有字段添加索引) ·
什么是覆盖索引:
第一,非主键查询,入口是二级索引(就是你平时定义的普通索引),通过二级索引,第一个过程返回聚集索引的id(主键id)因为二级索引里面存的就是聚集索引的id;第二个过程是回表,相当于再做一次数据检索,然后从聚集索引中获取数据
第二,主键查询,入口是直接通过聚集索引的id,可以在聚集索引中获取数据
第三,覆盖索引,入口是二级索引,直接从二级索引当中获取数据,前提是你所查询的字段都带有索引
优化方案二sql改写
优化前提是create_time字段有索引,思路是从索引中取出20条满足条件的主键值,然后回表获取记录
select * from test t1 inner join (select id from test order by create_time limit 99990,10) t2 on t1.id = t2.id
join_buffer(Bloack Nested-Loop)表示不能通过索引去做关联条件的匹配
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。