sql语句优化总结
sql语句优化总结
数据库优化的几个原则:
1.尽量避免在列上做运算,这样会导致索引失败;
2.使用join是应该用小结果集驱动大结果集,同时把复杂的join查询拆分成多个query。不然join的越多表,就会导致越多的锁定和堵塞。
3.注意like模糊查询的使用,避免使用%%,例如select * from a where name like '%de%';
代替语句:select * from a where name >= 'de' and name < 'df';
4.仅列出需要查询的字段,不要使用select * from ...,节省内存;
5.使用批量插入语句,节省交互;
insert into a (id ,name)
values(2,'a'),
(3,'s');
6.limit基数比较大时,使用between ... and ...
7.不要使用rand函数随机获取记录;
8.避免使用null ,这就需要在建表时,尽量设置为not null,提升查询性能;
9,不要使用count(id),而应该是count(*)
10.不要做无谓的排序,尽可能在索引中完成排序;
我们先来看一个sql:
select
ii.product_id,
p.product_name,
count(distinct pim.pallet_id) count_pallet_id,
if(round(sum(itg.quantity),2) > -1 && round(sum(itg.quantity),2) < 0.005, 0, round(sum(itg.quantity),2)) quantity,
round(ifnull(sum(itag.locked_quantity), 0.00000),2) locked_quantity,
pc.container_unit_code_name,
if(round(sum(itg.qoh),2) > -1 && round(sum(itg.qoh),2) < 0.005, 0, round(sum(itg.qoh),2)) qoh,
round(ifnull(sum(itag.locked_qoh), 0.00000),2) locked_qoh,
p.unit_code,
p.unit_code_name
from (select
it.inventory_item_id item_id,
sum(it.quantity) quantity,
sum(it.real_quantity) qoh
from
ws_inventory_transaction it
where
it.enabled = 1
group by
it.inventory_item_id
) itg
left join (select
ita.inventory_item_id item_id,
sum(ita.quantity) locked_quantity,
sum(ita.real_quantity) locked_qoh
from
ws_inventory_transaction_action ita
where
1=1 and ita.type in ('locked', 'release')
group by
ita.inventory_item_id
)itag on itg.item_id = itag.item_id
inner join ws_inventory_item ii on itg.item_id = ii.inventory_item_id
inner join ws_pallet_item_mapping pim on ii.inventory_item_id = pim.inventory_item_id
inner join ws_product p on ii.product_id = p.product_id and p.status = 'OK'
left join ws_product_container pc on ii.container_id = pc.container_id
//总起来说关联太多表,设计表时可以多一些冗余字段,减少表之间的关联查询;
where
ii.inventory_type = 'raw_material' and
ii.inventory_status = 'in_stock' and
ii.facility_id = '' and
datediff(now(),ii.last_updated_time) < 3 //违反了第一个原则
and p.product_type = 'goods'
and p.product_name like '%果%' // 违反原则3
group by
ii.product_id
having
qoh < 0.005
order by
qoh desc
上面的sql我们在from 中使用了子查询,这样对查询是非常不利的;
更好的一种做法是下面的语句:
select
t.facility_id,
f.facility_name,
t.inventory_status,
wis.inventory_status_name,
t.inventory_type,
t.product_type,
t.product_id,
p.product_name,
t.container_id,
t.unit_quantity,
p.unit_code,
p.unit_code_name,
pc.container_unit_code_name,
t.secret_key,
sum(t.quantity) quantity,
sum(t.real_quantity) real_quantity,
sum(t.locked_quantity) locked_quantity,
sum(t.locked_real_quantity) locked_real_quantity
from ( select
ii.facility_id,
ii.inventory_status,
ii.inventory_type,
ii.product_type,
ii.product_id,
ii.container_id,
ii.unit_quantity,
ita.secret_key,
ii.quantity quantity,
ii.real_quantity real_quantity,
sum(ita.quantity) locked_quantity,
sum(ita.real_quantity) locked_real_quantity
from
ws_inventory_item ii
inner join ws_inventory_transaction_action ita on ii.inventory_item_id = ita.inventory_item_id
where
ii.facility_id = '{$facility_id}' and
ii.inventory_status = '{$inventory_status}' and
ii.product_type = '{$product_type}' and
ii.inventory_type = '{$inventory_type}' and
ii.locked_real_quantity > 0 and
ita.type in ('locked', 'release')
group by
ii.product_id, ita.secret_key, ii.container_id, ita.inventory_item_id
having
locked_real_quantity > 0
) as t
inner join ws_product p on t.product_id = p.product_id
left join ws_facility f on t.facility_id = f.facility_id
left join ws_inventory_status wis on wis.inventory_status = t.inventory_status
left join ws_product_container pc on pc.container_id = t.container_id
group by
t.product_id, t.secret_key, t.container_id
注意:
1、from 语句中一定不要使用子查询;
2、使用更多的where加以限制,缩小查找范围;
3、合理利用索引;
4、通过explain查看sql性能;
相关优化可以借鉴:http://blog.csdn.net/csh624366188/article/details/8457749
sql语句优化总结的更多相关文章
- 优化数据库的方法及SQL语句优化的原则
		
优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...
 - oracle之sql语句优化
		
oracle之sql语句优化 sql语句的优化 1.在where子句中使用 is null 或 is not null 时,oracle优化器就不能使用索引了. 2.对于有连接的列,即使最有一个是静态 ...
 - 数据库 基于索引的SQL语句优化之降龙十八掌(转)
		
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
 - 数据库的优化(表优化和sql语句优化)
		
在这里主要是分为表设计优化和sql语句优化两方面来实现. 首先的是表设计优化: 1.数据行的长度不要超过8020字节.如果是超过这个长度的话这条数据会占用两行,减低查询的效率. 2.能用数字类型就不要 ...
 - MySQL常用SQL语句优化
		
推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...
 - 浅谈mysql配置优化和sql语句优化【转】
		
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
 - MySQL基础操作&&常用的SQL技巧&&SQL语句优化
		
基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t ...
 - 关于索引的sql语句优化之降龙十八掌
		
1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连.超时,严重影响业务的正 ...
 - SQL系列 - SQL语句优化个人总结
		
关于SQL语句优化方法 有些是通用的(如避免Select *): 有些不同的数据库管理系统有所区别(如Where子句顺序): 然后必须根据实际环境进行调优,因为即使是相同的数据库和表,在数据量或其他环 ...
 
随机推荐
- java从txt文档读写数据
			
package com.abin.facade.ws.mail.function; import java.io.BufferedReader; import java.io.File; import ...
 - 由button标签在 IE 8.0 下的异常表现引发的一场血案
			
写在最前的最后:整篇文章絮絮叨叨说了半天,我得出一个最佳实践:和button标签say goodbay,用 a 标签模拟之. 首先看一个在chrome 下的简单demo 这样的布局在组件开发中再常见不 ...
 - 【bug】—— ios scroll 滚动穿透
			
BUG描述 在 ios 微信浏览器或原生浏览器中,主内容容器.content在文档流内,并且overflow-y: scroll.在其之上有一个 fixed 定位的弹出层.popUp,滚动.popUp ...
 - mxonline实战2, 后台管理神器xadmin
			
对应github地址:xadmin的使用 第三天:xadmin的安装以及各应用模型的后台管理注册 一. 安装xamdin 1. 源码包下载地址 https://gith ...
 - 爬虫实战4:用selenium爬取淘宝美食
			
方案1:一次性爬取全部淘宝美食信息 1. spider.py文件如下 __author__ = 'Administrator' from selenium import webdriver from ...
 - SpringData JPA实现CRUD,分页与多参数排序
			
Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库.Map-Reduce 框架.云数据服务等等,SpringData JPA是简化创建 JPA ...
 - java日期时间
			
字母 日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 w 年中的周数 Number 27 ...
 - mariadb配置主从同步遇到的问题
			
一:ERROR: No query specified 解决方案: \G后面不能再加分号;,因为\G在功能上等同于;,如果加了分号,那么就是;;(2个分号),SQL语法错误 二:主从同步不成功 Sla ...
 - 洛谷P3830 [SHOI2012]随机树(期望dp)
			
题面 luogu 题解 第一问: 设\(f[i]\)表示\(i\)步操作后,平均深度期望 \(f[i] = \frac {f[i - 1] * (i - 1)+f[i-1]+2}{i}=f[i-1]+ ...
 - Codeforces - 149D 不错的区间DP
			
题意:有一个字符串 s. 这个字符串是一个完全匹配的括号序列.在这个完全匹配的括号序列里,每个括号都有一个和它匹配的括号 你现在可以给这个匹配的括号序列中的括号染色,且有三个要求: 每个括号只有三种情 ...