事情的过程是:公司有一个上百行的sql 运行在MySQL数据库,速度奇慢无比,逻辑乱七八糟,我就不贴出来了,经过这次修改想总结一下如何写一个不被人骂的sql。

说一些被人诟病的问题:

一、子查询

  把你的子查询全部改为join!!! 把你的子查询全部改为join!!! 把你的子查询全部改为join!!!  不要搞子查询,因为子查询的速度真的很慢。

把你用到的表先准备出来,找好关联关系做成 left join 或者 inner join 别问我为什么不用 right join mysql里面没有啊~

二、没索引

  几个必须加索引的地方:

  1.主键自动建立唯一索引

  2. 频繁作为where条件语句查询的字段

  3. 关联字段需要建立索引,比如join表 on的字段

  4. 排序字段可以建立索引

  5. 分组字段可以建立索引,因为分组的前提是排序

  6. 统计字段,聚合函数 可以建立索引,例如count(),max()

  当然索引也不是哪都合适的:

  1.频繁更新的字段不适合建立索引

  2.where条件中用不到的字段不适合建立索引

  3.表数据可以确定比较少的不需要建索引 少于1000条

  4.数据重复且发布比较均匀的的字段不适合建索引(唯一性太差的字段不适合建立索引),例如性别,状态

  5. 参与列计算的列不适合建索引

  索引什么时候会失效:

  1. 索引中不能有列的值是null 所以 is null 或者 not null 索引不起作用

  2. 单独引用复合索引里非第一位置的索引列:比如索引是a,b,c  那么 a / a,b / a,b,c 都可以使用索引,而 b / b,c 则不行

  3. 对索引列运算 运算包括(+、-、*、/、!、<>、%、like’%_’(%放在前面)、or、in、exist等),导致索引失效。

  4. 对索引应用内部函数 比如: select * from table_A  where ROUND(id) = 1 此时应该建ROUND(id)为索引。

  5. 类型错误,如字段类型为varchar,where条件用number。

例:id字段是varchar类型。

错误写法:select * from table where id= 1

正确写法:select * from table where id = ‘1’

  6. 当or 条件时 必须所有的条件都是独立索引才能走索引

  7. mysql查询只能使用一个索引,如果where中已经使用了索引,那么order by 中就无法使用。前半句举例:select * from table where xxx= '1' and yyy =2 如果 xxx,yyy都时独立索引 那么只能xxx走了索引,其实已经很快了,如果想更快就建组合索引。

  创建索引

  1. 普通索引:create index '索引名'  on '表名' ('字段名‘(length));  alter table '表名' add index '索引名' ('字段名 (ength));

  2. 唯一索引 可以为空 :create unique index '索引名'  on '表名' (字段名(length));

  3. 主键索引 唯一切不为空:alter table ‘表名’ add primary key(‘列名’);

  4. 组合索引:create index '索引名'  on '表名'('字段名1’,'字段名2’);

三、正确选择 in , exists 和inner join

  1. 如果集合比较小的时候,选择in 因为 in 先查询子集

  2. 如果集合比较大的时候,选择exists 因为 exists 先查询主查询 exists 简单使用:

  SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)

  这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?

  EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 。

  EXISTS 指定一个子查询,检测 行 的存在。

  语法: EXISTS subquery

  参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。

  结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。

  3. 如果是not 就选exists 吧 。

  4. inner joiin 如果你用 in 或者 exists 是会返回主表的行  但是inner join 如果子查询有重复值的话 就会返回重复行 。

让你的sql开启氮气加速的更多相关文章

  1. Azure CDN:氮气加速已开启,司机们请做好准备

    在上一周,我们向各位小伙伴介绍了通过 Azure CDN 高级版服务为 HTTPS 应用加速的做法,漏掉的小伙伴可以点击这里穿越回去补课哦.那我们今天讲点什么呢?当然是 CDN 最重要的价值:改善应用 ...

  2. 用CSS开启硬件加速来提高网站性能

    国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/rubylouvre/p/3471490.html 原文地址:http://blog.teamt ...

  3. 开启gpu加速的高性能移动端相框组件!

    通过设置新的css3新属性translateX来代替传统的绝对定位改变left值的动画原理,新属性translateX会开启浏览器自带的gpu硬件加速动画性能,提高流畅度从而提高用户体验, 代码有很详 ...

  4. ubuntu 15 安装cuda,开启GPU加速

    1 首先要开启GPU加速就要安装cuda.安装cuda,首先要安装英伟达的驱动.ubuntu有自带的开源驱动,首先要禁用nouveau.这儿要注意,虚拟机不能安装ubuntu驱动.VMWare下显卡只 ...

  5. 用CSS开启硬件加速来提高网站性能(转)

    翻译文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-cs ...

  6. 怎么看网站是否开启CDN加速?测试网站全国访问速度方法详解

    注意域名,动静分离的网站,只对静态文件的域名做了cdn 怎么看网站有没开启CDN? 要看一个网站是否开启CDN,方法很简单,只要在不同的地区ping网址就可以,比如在山东济南ping www.jb51 ...

  7. CSS开启硬件加速 hardware accelerated

    作者:孙志勇 微博 日期:2016年12月6日 一.时效性 所有信息都具有时效性.文章的价值,往往跟时间有很大关联.特别是技术类文章,请注意本文创建时间,如果本文过于久远,请读者酌情考量,莫要浪费时间 ...

  8. CSS开启硬件加速提高网站性能

    国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/yzw7489757/ 原文地址:http://blog.teamtreehouse.com/i ...

  9. spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql

    spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql

随机推荐

  1. 为什么不使用SOAP进行点对点联系,而使用ESB呢

    图片截至: https://www.zhihu.com/question/29475224

  2. layer.open打开一个新的jsp页面,如何关闭并刷新父页面问题

    layer.open打开一个新的jsp页面弹框,如何关闭呢? 在新的页面提交完毕之后,关闭并刷新父页面列表. layer.closeAll(); parent.layer.closeAll(); wi ...

  3. 04-numpy读取本地数据和索引

    1.numpy读取数据 CSV:Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录 由于csv便于展示,读取和 ...

  4. EF Core 实现读写分离的最佳方案

    前言 公司之前使用Ado.net和Dapper进行数据访问层的操作, 进行读写分离也比较简单, 只要使用对应的数据库连接字符串即可. 而最近要迁移到新系统中,新系统使用.net core和EF Cor ...

  5. Java 添加、修改、读取、删除PPT备注

    概述 幻灯片中的备注信息是只提供给幻灯片演讲者观看的特定内容,在演讲者放映幻灯片时,备注信息可给演讲者提供讲解思路,起到辅助讲解的作用.本文将通过Java程序来演示如何操作PPT幻灯片中的备注信息,要 ...

  6. 什么是javascript字面量,常量,变量,直接量?

    1.字面量是变量的字符串表示形式.它不是一种值,而是一种变量记法. var a = 1 //1是字面量 var b = 'css' //css是字面量 var c = [5,6,7] //567是字面 ...

  7. 题解:2018级算法第二次上机 Zexal的竞赛

    题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...

  8. VMware15.5版本下安装Windows_Server_2008_R2

    一.新建虚拟机 第一步:打开VMware15.5虚拟机,在欢迎界面点击新建虚拟机: 第二步:选择典型(推荐)选项-->适用于新手,单击下一步: 第三步:选定最后一项稍后安装操作系统,单击下一步: ...

  9. Linux重要配置文件

    目录 简介 0x01 系统重要文件 0x02 用户重要文件 0x03 重要日志文件 本教程概述 本课时学习Linux系统中重要的配置文件. 用到的工具 SshClient Ubuntu 标签 Linu ...

  10. PHP 插入排序 -- 直接插入排序

    1)直接插入序 -- Straight Insertion Sort 时间复杂度 :O(n^2) 适用条件: 适合记录数不多的情况 1 <?php 2 $a = [0 =>3,4,5,1, ...