在数据库应用中,程序员们通过不断的实践总结了很多经验,这些经验是一些普遍适用的规则。每一个程序员都应该了解并记住它们,在构造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个原则的更多相关文章

  1. 自制小工具大大加速MySQL SQL语句优化(附源码)

    引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又 ...

  2. php面试专题---MYSQL查询语句优化

    php面试专题---MYSQL查询语句优化 一.总结 一句话总结: mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存) ...

  3. SQL基本语句的优化10个原则

    原则一:尽量避免在列上进行运算,这样会导致索引失效. 例如: ; 优化: SELECT * FROM table WHERE d >= '2011-01-01'; 原则二:使用JOIN时,应该用 ...

  4. MySQL 查询语句优化思路

    query 语句的优化思路和原则主要提现在以下几个方面:1. 优化更需要优化的Query:2. 定位优化对象的性能瓶颈:3. 明确的优化目标:4. 从 Explain 入手:5. 多使用profile ...

  5. MYSQL查询语句优化

    mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...

  6. MYSQL SQL语句优化

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...

  7. 【转】mysql in语句优化

    mysql会对sql语句做优化, in 后面的条件不超过一定数量仍然会使用索引.mysql 会根据索引长度和in后面条件数量判断是否使用索引. 另外,如果是in后面是子查询,则不会使用索引. 一个文章 ...

  8. select * 为什么不好? limit 1 为什么好? --mysql SQL语句优化

    问题一: Select * from  student;  这种语句不好 我的理解:根据Innode存储引擎以及网上的各种资料所说的innodb的B+树索引结构可以分析出,当在非聚集索引列上搜索若用s ...

  9. 【转】Mysql查询语句优化策略

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

随机推荐

  1. 【leetcode dp】132. Palindrome Partitioning II

    https://leetcode.com/problems/palindrome-partitioning-ii/description/ [题意] 给定一个字符串,求最少切割多少下,使得切割后的每个 ...

  2. 【2018.11.23】2018WCTest(7)

    向已退役学长致敬! 题目&他的题解 T1 一道睿智题目,正常思路就是时空复杂度均为 $O(n\times 32768)$ 的背包.这个做法不被卡时间却被卡空间,其实就是想让你离线处理询问,然后 ...

  3. OpenJ_Bailian3375

    Farmer John has decided to reward his cows for their hard work by taking them on a tour of the big c ...

  4. 【jquery创建元素添加元素】

    使用jquery创建新元素的方法为:$(html标签),例如 $("<p></p>")创建了一个段落.注意此时只是创建了对象,尚未添加到文档节点中去:以下四 ...

  5. Java线程池快速学习教程

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  6. 「CodePlus 2018 4 月赛」最短路

    $n \leq 100000$,$m \leq 500000$的有向图,两点之间还可以以$a \ \ xor \ \ b$的代价从$a$到$b$,问$s$到$t$的最短路. 被自己蠢哭QAQ 首先两个 ...

  7. xrandr

    ubuntu 外接显示器 xrandr常用命令(这里的VGA与LVDS分别换成第1步中的设备名,如VGA1.LVDS1): xrandr --output VGA --same-as LVDS --a ...

  8. js Math [ 随机数、绝对值、四舍五入、进一取整、舍去取整、最大值、最小值、圆周率 ]

    <script> /* 数学对象:Math */ with (document) { write('<br>-3.5的绝对值:'+Math.abs(-3.5)); write( ...

  9. jquery 禁用/启用滚动条

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Java 读写文件大全

    原文:http://www.open-open.com/code/view/1423281836529 java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内 ...