SQL性能优化的几点建议
1. 索引:
索引可以提高查询的速度,但不是使用带有索引的字段查询时,索引都会起作用,如下几种特殊情况下,有可能使用带有索引的字段查询时,索引没有起作用:
1)使用LIKE关键字的查询语句
如果匹配字符串的第一个字符为“%”,索引不会起作用,只有“%”不在第一个位置,索引才会起作用
2)使用多列索引的查询语句
Mysql可以为多个字段创建索引,一个索引可以包括16个字段,对于多列索引,只有查询条件中使用了这些字段中的第一个字段后时,索引才会被使用。
3)使用OR关键字的查询语句
查询语句的查询条件中只有OR关键字,且OR前后两个条件中的列都是索引时,查询中才使用索引,否则查询将不使用索引。
2. 不同SQL语句的优化方法
1)INSERT语句
a) 一次性批次插入多行数据与多次分别插入相比,将大大缩短客户端与服务器之间的连接和关闭等操作,如:
insert into books values (1,"book1"), (2, "book2"), (3, "book3");
b) 通常可以锁定表以加速插入数据,如下:
lock tables books;
insert into books values (1,"book1"), (2, "book2"), (3, "book3");
unlock tables;
2) ORDER BY语句
通常使用索引来对ORDER BY语句进行优化,几个常用的例子如下:
a) ORDER BY + LIMIT 组合的索引进行优化,如:
select id, name, age from user order by id limit 0,15; ---只需在id上建立索引即可
b) WHERE + ORDER BY + LIMIT 组合的索引优化,如:
select id, name, age from user where name="lilei" order by id limit 0,15;---此时如果只对id添加索引,效率不是很高,此时可以建立一个联合索引(id,name)
c) 不要对WHERE 和 ORDER BY的选项使用表达式或者函数,如:
select id, name, age from user order by max(id) limit 0,15;
下面这几种情况下不适合使用索引:
a)ORDER BY的字段使用 asc、desc
b) WHERE 子句使用的字段和ORDER BY的字段不一致,如:
select id, name, age from user where name="lilei" order by id;
c) 对不同给的关键字使用ORDER BY排序,如:
select id, name, age from user order by id, name;
3) GROUP BY语句
使用GROUP BY语句时,Mysql会对符合的结果自动排序,通过扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累计行数,
在某些情况下,Mysql可以通过索引访问而不使用临时表。通过制定 GROUP BY NULL来禁止排序, 从而可以节省损耗。
4)优化嵌套查询
可以使用连接(JOIN)来代替子查询(内层嵌套的select语句),连接查询不需要建立临时表,其查询速度比子查询要快,如果查询中使用索引的话,性能会更好。
补充一下join及union的区别:
(1)union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同,
也就是说如果A表中有三条数据,B表中有两条数据,那么A union B就会有五条数据。
(union 和union all的差别,对于union如果存在相同的数据记录会被合并,而union all不会合并相同的数据记录,该有多少条记录就会有多少条记录。)
(2)join偏于横向的联合。join跟union比起来显得更宽松,对两个表的字段不做要求,没有限制条件的join等于两个表的笛卡尔乘积,所有join需要有限制条件来约束,经过限制的join就是横向的扩张了。
5)优化OR条件
对于使用OR条件的子查询,如果要使用索引,则OR之间的每个条件列都必须使用到索引,创建索引后,是对OR的各个字段在查询结果后在进行UNION操作。
SQL性能优化的几点建议的更多相关文章
- SQL性能优化
引言: 以前在面试的过程中,总有面试官问道:你做过sql性能优化吗?对此,我的答复是没有.一次没有不是自己的错误,两次也不是,但如果是多次呢?今天痛下决心,把有关sql性能优化的相关知识总结一下,以便 ...
- SQL Select count(*)和Count(1)的区别和执行方式及SQL性能优化
SQL性能优化:http://www.cnblogs.com/CareySon/category/360333.html Select count(*)和Count(1)的区别和执行方式 在SQL S ...
- ORACLE数据库学习之SQL性能优化详解
Oracle sql 性能优化调整 ...
- SQL 性能优化 总结
SQL 性能优化 总结 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving ...
- SQL性能优化前期准备-清除缓存、开启IO统计
文章来至:https://www.cnblogs.com/Ren_Lei/p/5669662.html 如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置 ...
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
- sql性能优化浅谈
sql性能优化总结: 最近随着数据越来越多,数据库性能问题暴露的越来越严重.几百万,上千万,甚至过亿的数据处理速度会非常的慢. 下面对工作中遇到的问题做下总结,希望以后能对日后的工作有所帮助. 不同的 ...
- SQL性能优化技巧
作者:IT王小二 博客:https://itwxe.com 这里就给小伙伴们带来工作中常用的一些 SQL 性能优化技巧总结,包括常见优化十经验.order by 与 group by 优化.分页查询优 ...
- SQL性能优化常见措施(Lock wait timeout exceeded)
SQL性能优化常见措施 目 录 1.mysql中explain命令使用 2.mysql中mysqldumpslow的使用 3.mysql中修改my.ini配置文件记录日志 4.mysql中如何加索引 ...
随机推荐
- 51 nod 1227 平均最小公倍数
原题链接 Lcm(a,b)表示a和b的最小公倍数,A(n)表示Lcm(n,i)的平均数(1 <= i <= n), 例如:A(4) = (Lcm(1,4) + Lcm(2,4) + Lcm ...
- [51nod1474]宝藏图
有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...
- [bzoj1223] [HNOI2002]Kathy函数
首先由题解可得TAT,f(i)=i当且仅当i在二进制下为回文串. 那么问题就变成了1~n中有多少个二进制下的回文串. 把m转成2进制后就是正常的统计了= =. f[i]表示二进制下,有多少个i位的回文 ...
- c语言基础学习01
=============================================================================每一种语言都有其独特的语法规则与语言定义. 指 ...
- 国寿e店/人寿云参会云助理,不去公司就能刷脸考勤打卡?
自从2017年3月平安保险公司实行E行销打卡考勤以来,保险增员迅猛增加,保险业绩也随之水涨船高.年底开始中国人寿保险也陆续开始实行app考勤,有些需要连接公司指定WiFi,或在指定地点方可打卡考勤.不 ...
- A glance at endpoint security
Last year hackers stole millions from Taiwan First Commercial bank's ATMs without using a card. This ...
- bat脚本设置系统环境变量即时生效
关于bat的资料多但零碎,记录一下. 1.设置环境变量即时生效:通过重启explorer来实现即时生效(亲测有效) @echo off set curPath=%cd% wmic ENVIRONMEN ...
- IIS、nginx、apache只允许域名访问配置
您开启WAF后,攻击者只能看到WAF的IP,不能看到您的IP,攻击者通过域名访问您的网站时,就会根据规则拦截. 但是如果您的网站可以输入IP地址直接访问,是无法达到防御效果的.比如(http://42 ...
- HTML <td> 标签的 rowspan 属性
rowspan 属性规定单元格可横跨的行数. colspan 属性规定单元格可横跨的列数.
- 【js 实践】js 实现木桶布局
还有两个月左右就要准备实习了,所以特意练一练,今天终于搞定了js 的木桶布局了 这一个是按照一个插件的规格去写的以防以后工作需要,详细的解释在前端网这里 http://www.qdfuns.com/n ...