这篇文章中我以MySQL做示例

首先我跟大家介绍一下explain,这个关键字可以查看sql的执行计划,具体字段如下:

SQL SERVER 执行时长过长的脚本 sql执行时间过长如何优化_字符串


该type列 EXPLAIN输出介绍如何连接表。在JSON格式的输出中,这些作为access_type属性的值找到。以下列表描述了连接类型,从最佳类型到最差类型:

system > const > eq_ref > ref > range > index > all

  • system
    该表只有一行(=系统表)。这是const联接类型的特例 。
  • const
    该表最多具有一个匹配行,该行在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。 const表非常快,因为它们只能读取一次。
  • eq_ref
    对于先前表中的每行组合,从此表中读取一行。除了 system和 const类型,这是最好的连接类型。当连接使用索引的所有部分并且索引为PRIMARY KEY或UNIQUE NOT NULLindex时使用。
  • ref
    对于先前表中的每个行组合,将从该表中读取具有匹配索引值的所有行。
  • range。使用索引查询行,仅检索给定范围内的行。如 where key=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()
  • index。对索引树进行全部扫描
  • ALL。对来查询的表进行全表扫描。

以下是一个示例,我们要尽量避免出现下例情况

SQL SERVER 执行时长过长的脚本 sql执行时间过长如何优化_值类型_02

这里记录一下常用到的SQL优化

1.sql优化我们记一件事就是尽量避免使用全表扫描,如上图

2.我们在查询时经常使用的where的字段一定要加索引

select * from table where number=1

这里的number如果使用次数多就加一个索引

3.在查询时尽量不要使用 in 如果是连续值请用between

不要使用这种 select * from table1 where  number in(1,2,3);
使用这种 select * from table1 where number BETWEEN 1 and 3;

4.查询的时候不要在where后面加表达式

不要用 select * from table1 where  number/2 =1;
使用 select * from table1 where number =1*2;

5.查询的时候不要用select * ,用到哪个字段查哪个

不要使用 select * from table;
使用 select number from table;

注:这篇文章都是用select * 作为例子而已,如 3、4、5

6.不要用where 1=1,字符串拼接的时候去判断

不要使用 select * from table where 1=1 and number=1;
使用 select * from table number=1;

7.查询用到 like的时候,不要把%放前面,就是说最好已知字符串开头用字符串的开头去匹配后面的字段,有索引的情况下‘%张’查询时间 是 ‘张%’查询时间的几何倍数,比如几十几百倍

不用 select * from table name like '%张%'
可以用
select * from table name like ‘张%’

8.不要频繁创建删除临时表,这样挺消耗系统资源的

9.数据量大的话建表时不要建索引,等所有数据入库后建索引

10.建表字段一定要合理,不用默认值为null,能用值类型就用值类型