让你的sql开启氮气加速
事情的过程是:公司有一个上百行的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开启氮气加速的更多相关文章
- Azure CDN:氮气加速已开启,司机们请做好准备
在上一周,我们向各位小伙伴介绍了通过 Azure CDN 高级版服务为 HTTPS 应用加速的做法,漏掉的小伙伴可以点击这里穿越回去补课哦.那我们今天讲点什么呢?当然是 CDN 最重要的价值:改善应用 ...
- 用CSS开启硬件加速来提高网站性能
国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/rubylouvre/p/3471490.html 原文地址:http://blog.teamt ...
- 开启gpu加速的高性能移动端相框组件!
通过设置新的css3新属性translateX来代替传统的绝对定位改变left值的动画原理,新属性translateX会开启浏览器自带的gpu硬件加速动画性能,提高流畅度从而提高用户体验, 代码有很详 ...
- ubuntu 15 安装cuda,开启GPU加速
1 首先要开启GPU加速就要安装cuda.安装cuda,首先要安装英伟达的驱动.ubuntu有自带的开源驱动,首先要禁用nouveau.这儿要注意,虚拟机不能安装ubuntu驱动.VMWare下显卡只 ...
- 用CSS开启硬件加速来提高网站性能(转)
翻译文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-cs ...
- 怎么看网站是否开启CDN加速?测试网站全国访问速度方法详解
注意域名,动静分离的网站,只对静态文件的域名做了cdn 怎么看网站有没开启CDN? 要看一个网站是否开启CDN,方法很简单,只要在不同的地区ping网址就可以,比如在山东济南ping www.jb51 ...
- CSS开启硬件加速 hardware accelerated
作者:孙志勇 微博 日期:2016年12月6日 一.时效性 所有信息都具有时效性.文章的价值,往往跟时间有很大关联.特别是技术类文章,请注意本文创建时间,如果本文过于久远,请读者酌情考量,莫要浪费时间 ...
- CSS开启硬件加速提高网站性能
国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/yzw7489757/ 原文地址:http://blog.teamtreehouse.com/i ...
- spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql
spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql
随机推荐
- linux目录化结构
初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...
- redis 漏洞造成服务器被入侵-CPU飙升
前言 前几天在自己服务器上搭了redis,准备想着大展身手一番,昨天使用redis-cli命令的时候,10s后,显示进程已杀死.然后又试了几次,都是一样的结果,10s时间,进程被杀死.这个时候我还 ...
- 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)
apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...
- MongoDB 学习笔记之 $or与索引关系
$or与索引关系: 对leftT集合的timestamp创建索引 执行$or语句:db.leftT.find({$or: [{ "timestamp" : 5},{"ag ...
- http post 请求,带参数,带请求头
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json url = 'http://............ ...
- 如何写md格式的文档
一.标题 标题其实和HTML中的h系列很像,想要设置为标题的文字前面加#来表示一个#是一级标题,二个#是二级标题,以此类推.支持六级标题. 注:标准语法一般在#后跟个空格再写文字, 示例: 效果如下: ...
- 视频作品《springboot基础篇》上线了
1.场景描述 第一个视频作品出炉了,<springboot基础篇>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. 课程内容 课程地址:https://ed ...
- Node.js入门教程 第三篇 (模块及路由)
Node.js的模块 Node.js的模块与传统面向对象的类(class)不完全相同.Node.js认为文件即模块,即一个文件是一个模块.单一文件一般只专注做一件事情,保证了代码的简洁性. 创建模块: ...
- Tomcat部署项目的三个方法
所需软件安装 要想在Tomcat中部署项目前提是先要搭建好Tomcat,搭建Tomcat就离不开以下软件包的安装配置,本次演示使用Linux平台 1.JDK软件包 JDK是一切java应用程序的基础, ...
- LeetCode_20-Valid Parentheses
给定一个字符串,其中包含字符’(’,’)’,’[’,’]’,’{‘,’}’,左括号必须匹配右括号,一对匹配的括号不能单独出现单个左括号或者右括号.如:(()[])有效,[(])无效空字符串也算是有效的 ...