zoukankan      html  css  js  c++  java
  • 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; 

  • 相关阅读:
    O(big oh) (big omega) (big theta)
    Ex 7_21 在一个流网络中,一条边被称为是临界的...第十三次作业
    Ex 7_17 考虑如下的网络(其中数字为对应边的容量)...第十三次作业
    Expm 10_2 实现Ford-Fulkerson算法,求出给定图中从源点s到汇点t的最大流,并输出最小割。
    pat1009
    pat1008
    pat1007
    pat1006
    pat1005
    pat1004
  • 原文地址:https://www.cnblogs.com/zjdeblog/p/6690321.html
Copyright © 2011-2022 走看看