浅谈SQL优化(一)

270 阅读2分钟

为什么要进行优化

在应用的开发过程中,由于初期数据量小,我们在写SQL语句时会比较重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的SQL语句就成为整个系统性能的瓶颈,影响用户的体验,因此,我们需要对SQL进行优化

如何排查与定位

1、通过慢查询日志定位那些执行效率较低的SQL语句 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题。

2、通过EXPLAIN分析低效SQL的执行计划

EXPLAIN SELECT * FROM film

查询结果如下: 各字段含义如下:

  • select_type:表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查,PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。
  • type:表示MySQL在表中找到所需行的方式,从左至右,性能由最差到最好 几个常用的指标解释: type=ALL,全表扫描;ype=index,索引全扫描;type=range,索引范围扫描,常见于<、<=、>、>=、between等操作符;type=ref,使用非唯一索引扫描或唯一索引的前缀扫描
  • key:表示实际使用的索引。
  • key_len:使用到索引字段的长度。
  • rows:扫描行的数量。

优化实例

 explain select sum(amount) from customer a, payment b where 1=1 and a.customer_id= b.customer_id and email = 'test';

email字段未加索引,触发全表扫描,扫描的行数:599行,添加索引后:

create index idx_email on customer(email);

查询扫描的行数降低到1行,对于大表,有必要对相应的字段创建索引。