SQL优化

来源:互联网 发布:一键越狱软件 编辑:程序博客网 时间:2024/06/08 17:34

通过explain:查询执行计划,如图
这里写图片描述
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。性能从最好到最差的链接类型为const(表示常数查找)、eq_reg(范围的查找)、ref(基于连接的查找)、range(基于索引的范围查找)、index(基于索引的扫描)、和All(表扫描)
possible_keys:显示可能应用在张表中的索引。如果为空,没有可能的索引。
key:实际使用的索引,如果为NULL,则没有使用索引。
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好。
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。
rows:MYSQL认为必须检查的用来返回请求数据的行数。
extra:列需要注意的返回值,如下:
这里写图片描述

1.Max()的优化

  查询最后支付的时间: select max (payment_date)from  payment

这里写图片描述
优化:建立索引create index idx_paydate on payment(payment_date)
这里写图片描述
索引为顺序排列的,容易查到最后一条记录,执行效率恒定

2.count()优化

在一条sql语句中同时查出2006年和2007年电影的数量。错误的方式:

这里写图片描述
count(*) 与count(列名)的区别
create table t(id int);
insert into t values(1),(2),(null);
select * from t;
select count(*) ,count (id) from t;

count (列) 不包括空值null
count(*)表的总行数

正确的方法:
这里写图片描述

3.子查询的优化

通常情况下,需要把子查询优化为join查询,但在优化时要注意关联键是否有一对多的关系,要注意重复数据。
子查询:
create table t (id int); id=1
create table t1(tid int); id =1 id =1
insert into t1 values(1);
insert into t1 values(1);
select * from t where t.id in (select t1.tid from t1);
select t.id from t join t1 on t.id = t1.tid; (会出现重复的状况)
去重的方法:select distinct t.id from t join t1 on t.id = t1.tid;
inner
left
right

4.group by查询优化

这里写图片描述
改写后:
这里写图片描述

5.limit查询优化

limit常用于分页处理,时常会伴随order by从句使用,因此大多时候会使用Filesorts(文件查询方式)这样会造成大量的IO问题。
这里写图片描述
这里写图片描述
优化步骤1:使用有索引的列或主键进行order by操作
这里写图片描述

这里写图片描述

这里写图片描述
如果是查询1000行的后五行记录,查询量就会逐渐增大,所以需要进一步的优化。
优化步骤2:记录上次返回的主键,在下次查询时使用主键过滤。
这里写图片描述

这里写图片描述

*避免了数据量大时扫描过多的记录

原创粉丝点击