MySQL基本语句优化10个原则
在数据库应用中,程序员们通过不断的实践总结了很多经验,这些经验是一些普遍适用的规则。每一个程序员都应该了解并记住它们,在构造SQL语句时,养成良好的习惯。以下10条比较重要的原则供大家参考。
原则1:尽量避免在列上做运算,这样会导致索引失败。例如原句为: SELECT * FROM t WHERE YEAR(d) >= 2011; 优化为:
SELECT * FROM t WHERE d >= ‘2011-01-01’;
原则2:使用join时,应该用小结果集驱动大结果集。同时把复杂的join查询拆分成多个query。因为join多个表时,可能导致更多的锁定和堵塞。例如: SELECT * FROM a JOIN b ON a.id = b.id LEFT JOIN c ON c.time = a.date LEFT JOIN d ON c.pid = b.aid LEFT JOIN e ON e.cid = a.did
原则3:注意like模糊查询的使用,避免%%。例如原句为: SELECT * FROM t WHERE name LIKE ‘%de%’ 优化为:
SELECT * FROM t WHERE name >= ‘de’AND name <= ‘df’
原则4:仅列出需要查询的字段,这对速度不会有明显的影响,主要考虑节省内存。例如原句为:
SELECT * FROM Member; 优化为:
SELECT id,name,pwd FROM Member;
原则5:使用批量插入语句节省交互。例如原句为: INSERT INTO t(id,name)VALUES(1,’a’); INSERT INTO t(id,name)VALUES(2,’b’); INSERT INTO t(id,name)VALUES(3,’c’); 优化为:
INSERT INTO t(id,name)VALUES(1,’a’),(2,’b’),(3,’c’);
原则6:limit的基数比较大的时候使用between。例如原句为: SELECT * FROM article AS article RODER BY id LIMIT 1000000,10; 优化为:
SELECT * FROM article AS article WHERE id BETWEEN 1000000 AND 1000010 RODER BY id;
Between限定比limit快,所以海量数据访问时,建议between或是where替换掉limit。但是between也有缺陷,如果id中间有断行或是中间部分id不读取的情况,总读取的数量会少于预计数量!
在取比较后面的数据时,通过desc方式把数据反向查找,以减少对前段数据的扫描,让limit的基数越小越好!
原则7:不要使用rand()函数获取多条随机记录。例如: select * from table order by rand() limit 20; 使用下面的语句代替:
Select * from ‘table’as t1 join(select rand(rand() * ((select max(id) from ‘table’)-(select min(id) from ‘table’))+(select min(id) from ‘table’))as id) as t2 where t1.id >= t2.id order by t1.id limit 1;
这是获取一条随机记录,这样即使执行20次,也比原来的语句高效。或者先用php产生随机数,把这个字符串传给MySQL,MySQL里用in查询。
原则8:避免使用null。
原则9:不要使用count(id),而应该是count(*)。
原则10:不要做无谓的排序操作,而尽可能在索引中完成排序。
原则
5
:使用批量插入语句节省交互。例如原句为:
INSERT INTO t(id,name)VALUES(1,
’
a
’
);
INSERT INTO t(id,name)VALUES(2,
’
b
’
);
INSERT INTO t(id,name)VALUES(3,
’
c
’
);
优化为:
INSERT INTO t(id,name)VALUES(1,
’
a
’
),(2,
’
b
’
),(3,
’
c
’
);
原则
6
:
limit
的基数比较大的时候使用
between
。例如原句为:
SELECT * FROM article AS article RODER BY id
LIMIT 1000000,10;
优化为:
SELECT
*
FROM
article
AS
article
WHERE
id
BETWEEN
1000000
AND
1000010
RODER BY id;
Between
限定比
limit
快,
所以海量数据访问时,
建议
between
或是
where
替换掉
limit
。
但是
between
也有缺陷,如果
id
中间有断行或是中间部分
id
不读取的情况,总读取的数
量会少于预计数量!
在取比较后面的数据时,
通过
desc
方式把数据反向查找,
以减少对前段数据的扫描,
让
limit
的基数越小越好!
原则
7
:不要使用
rand()
函数获取多条随机记录。例如:
select * from table order by rand() limit 20;
使用下面的语句代替:
Select
*
from
‘
table
’
as
t1
join(select
rand(rand()
*
((select
max(id)
from
‘
table
’
)-(select min(id) from
‘
table
’
))+(select min(id) from
‘
table
’
))as id) as
t2 where t1.id >= t2.id order by t1.id limit 1;
MySQL基本语句优化10个原则的更多相关文章
- 自制小工具大大加速MySQL SQL语句优化(附源码)
引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又 ...
- php面试专题---MYSQL查询语句优化
php面试专题---MYSQL查询语句优化 一.总结 一句话总结: mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存) ...
- SQL基本语句的优化10个原则
原则一:尽量避免在列上进行运算,这样会导致索引失效. 例如: ; 优化: SELECT * FROM table WHERE d >= '2011-01-01'; 原则二:使用JOIN时,应该用 ...
- MySQL 查询语句优化思路
query 语句的优化思路和原则主要提现在以下几个方面:1. 优化更需要优化的Query:2. 定位优化对象的性能瓶颈:3. 明确的优化目标:4. 从 Explain 入手:5. 多使用profile ...
- MYSQL查询语句优化
mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...
- MYSQL SQL语句优化
1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...
- 【转】mysql in语句优化
mysql会对sql语句做优化, in 后面的条件不超过一定数量仍然会使用索引.mysql 会根据索引长度和in后面条件数量判断是否使用索引. 另外,如果是in后面是子查询,则不会使用索引. 一个文章 ...
- select * 为什么不好? limit 1 为什么好? --mysql SQL语句优化
问题一: Select * from student; 这种语句不好 我的理解:根据Innode存储引擎以及网上的各种资料所说的innodb的B+树索引结构可以分析出,当在非聚集索引列上搜索若用s ...
- 【转】Mysql查询语句优化策略
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
随机推荐
- 【Luogu】P1967货车运输(最大生成森林+倍增LCA)
题目链接 倍增LCA是个什么蛇皮原理啊,循环完了还得再往上跳一次才能到最近公共祖先 合着我昨天WA两次就是因为这个 建最大生成森林,因为图不一定是联通的,所以不一定是一棵树.这个地方用克鲁斯卡尔就好了 ...
- BZOJ 1072 [SCOI2007]排列perm ——状压DP
[题目分析] 没什么好说的,水题. 代码比较丑,结果需要开long long 时间爆炸 [代码] #include <cstdio> #include <cstring> #i ...
- [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...
- SHoj 420 购买装备
购买装备 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 最近盛大的一款游戏传奇世界极其火爆. ...
- 【SPOJ220】Relevant Phrases of Annihilation(后缀数组,二分)
题意: n<=10,len<=1e4 思路: #include<cstdio> #include<cstring> #include<string> # ...
- gulp 环境搭建
wind+r弹出cmd命令窗口 要先安装node及npm,检查是否安装成功,node -v,npm -v可查看nod及npm的版本号. 安装gulp之前我们需要安装nodejs的环境,检测能够正常使用 ...
- 选取第K大数的快速选择算法和注意事项
快速选择算法,是一种能在大致O(N)的时间内选取数组中第k大或者k小的算法.其基本思路与快速排序算法类似,也是分治的思想. 其实这个算法是个基础算法,但是不常用,所以今天编的时候错了POJ2388,才 ...
- hdu2448 / 费用流 / harbin赛区c题
题(自)目(己)错(英)综(语)复(太)杂(差),关系理了半小时+翻译才看明白,看明白之后,直接建图,费用流击杀./简单题. 2A:有的地方,可用互通的要建双向边! #include<cstdi ...
- Spark学习(一) Spark初识
一.官网介绍 1.什么是Spark 官网地址:http://spark.apache.org/ Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于A ...
- 使用wget进行整站下载(转)
wget在Linux下默认已经安装,Windows下需要自行安装. Windows下载地址:http://wget.addictivecode.org/Faq.html#download,链接:htt ...