SQL优化

xiaoxiao2021-02-28  3

通过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:记录上次返回的主键,在下次查询时使用主键过滤。

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

转载请注明原文地址: https://www.6miu.com/read-1150224.html

最新回复(0)