需要的准备知识

1最左前缀匹配

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,

对于where条件

a = 1 and b> 2 and c = 3

如果我们建立(a,b,c)顺序的索引,

那么c 是用不到索引的,如果建立(a,c,b)的索引则都可以用到,a,c的顺序可以任意调整。

当我们建立(a,b)的复合索引

对于where条件

a = 1 依然是可以用到索引的。

注意:

=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,

mysql的查询优化器会帮你优化成索引可以识别的形式

2 sql索引原则

2.1索引列的区分度尽量要高,区分度的计算公式count(distinct col)/count(*)

唯一键的区分度是1,而比如类似 状态,性别等字段在大数据面前区分度是0

2.2要保持索引列的值的干净,不能参与计算

比如 假如用户年龄上有索引

Select id from user where age>2 (会走索引)

Select id from user where age-2>0 (不会走索引)

2.3尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引

修改即可。

3优化神器 explain / desc 的使用

在你原来的sql语句之前加上 explain 就可以查看mysql对于该语句的执行计划

如下图所示

type

const(常量连接),比如SELECT * FROM user WHERE id=1;

eq_ref(等值引用),比如SELECT * FROM user,card WHERE user.id=card.userid;

ref(引用),用于非唯一索引,比如SELECT * FROM user,card WHERE user.last_name='test';

range(范围),比如SELECT * FROM tbl_name WHERE key_column > 10;

unique_subquery  子查询 针对唯一索引或者主键

index_subquery  子查询 针对非唯一索引列

index(索引),根据索引来读取数据,如果索引已包含了查询数据,只需扫描索引树,否则执行全表扫描和All类似;

ALL(所有),全表扫描

Extra

Using index:表示使用索引,如果同时出现Using where,代表使用索引来查找读取记录,如果没有Using where,表示索引包含查询数据,无需额外的查找;

Using where:表示条件查询,如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询:返回所有数据;

Using filesort:不是“使用文件索引”的含义!filesort是MySQL所实现的一种排序策略,通常在使用到排序语句ORDER BY的时候,会出现该信息;  [非索引字段排序]

Using temporary:表示为了得到结果,使用了临时表,这通常是出现在多表联合查询,结果排序的场合。

我们需要重点关注rows。

优化方法(步骤)

1.先运行看看是否真的很慢,注意看是否设置了SQL_NO_CACHE。优化之前先关闭。

2.explain查看执行计划,看那些地方比较慢

3.order by limit 形式的sql语句让排序的表优先查(也就是遇到这类情况,我们可以先去掉order by limit 看是不是他导致的)

4.加索引时参照上面的sql索引原则

5.观察结果,不符合预期继续从1分析

sql语句性能优化的更多相关文章

  1. Oracle SQL语句性能优化方法大全

    Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...

  2. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

  3. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  4. 数据库SQL语句性能优化

    选择最有效率的表名顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下 ...

  5. Oracle之SQL语句性能优化(34条优化方法)

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...

  6. Mysql性能优化一:SQL语句性能优化

    这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 w ...

  7. Mysql 52条SQL语句性能优化策略汇总

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...

  8. SQL语句性能优化策略

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引.2.应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认 ...

  9. SQL Server性能优化(6)查询语句建议

    1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...

随机推荐

  1. 多线程服务端与客户端通信(IO是阻塞的)_02

    下面是多线程的;每次服务端接受请求,会创建一个线程专门处理这个请求: 虽然是多线程的,但还是阻塞,相当于单线程处理模式 public class TimeServer { public static ...

  2. Linux修改用户所在组方法

    Linux修改用户所在组方法 usermod -g 用户组 用户名强行设置某个用户所在组usermod -G 用户组 用户名把某个用户改为 group(s) usermod -a -G 用户组 用户名 ...

  3. css 之过渡效果

    之前写css的效果,都是使用js 来完成的,但是写js比较耗费时间,有时候逻辑不对,还出不来效果,所以也比较烦:所以一些简单的效果,就使用css 来完成会比较好一些,不必耗费太多的精力: 但是写css ...

  4. Delphi 10.3中使用JSON

    有一个对JSON处理的单元,在你需要使用JSON的单元里面引入"System.json",随后你就可以用Delphi自己的json处理类了. 注意:   1,JSON类创建后,里面 ...

  5. js导出excel文件

    <div id="tablesDiv"> <table id="tabDiv1"> <tbody><tr> &l ...

  6. Kivy / Buildozer VM Ubuntu不能连接到网络的问题解决

    从kivy网站下载下来的Buildozer VM镜像在进入虚拟机以后无论虚拟机里边的虚拟网络编辑器以及网络适配器网络连接作何设置都不能连接到网络,在终端里边使用ifconfig查看ip地址是127.0 ...

  7. 简易机器学习代码(LR,Kmeans,NN,RNN)

    Logistic Regression 特别需要注意的是 exp 和 log 的使用. sigmoid 原始表达式为 1 / (1+exp(-z)),但如果直接使用 z=-710,会显示 overfl ...

  8. php7 curl返回false error返回空串

    php7 CURLOPT_SSL_VERIFYPEER 禁用后cURL将终止从服务端进行验证.使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURL ...

  9. 团队作业5——《Spring_Four》项目需求改进与系统设计

    团队项目需求分析改进: 任务1: a.分析<基于Jsoup的大学生考试信息展示系统项目需求规格说明书>初稿的不足,特别是文档需求描述建模不完整的内容. 通过软件工程更深入的学习发现我们的需 ...

  10. jquery中的globalEval()源码分析

    //20170724 huanhua 定义成全局的变量 // 在谷歌浏览器下运行的: // function fun(){ eval('var a=1'); } 此时 定义的 a 就是局部的变量 // ...