SQL基本語句的優化10個原則


原則一盡量避免在列上進行運算,這樣會導致索引失效。

例如: 

SELECT * FROM table WHERE YEAR(d) >= 2011;

優化: 

SELECT * FROM table WHERE d >= '2011-01-01';  

原則二:使用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 

原則三:注意LIKE模糊查詢的使用,避免%%。

例如:

SELECT * FROM table WHERE name LIKE '%de%';

優化: 

SELECT * FROM table WHERE name >= 'de' AND name < 'df';  

原則四:僅列出需要查詢的字段,這對速度不會有明顯的影響,主要考慮節省內存。

例如:

SELECT * FROM table;

優化:

SELECT id,name,pwd FROM table;  

原則五:使用批量插入語句節省交互。

例如:

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');  

原則六:LIMIT 的基數比較大時使用 BETWEEN。

例如:

SELECT * FROM article ORDER BY id LIMIT 100000,10

優化:

SELECT * FROM article WHERE id BETWEEN 100000 AND 100010 ORDER BY id;

BETWEEN 限定比 LIMIT 快,所以在海量數據訪問時,建議用 BETWEEN 或是 WHERE 替換掉 LIMIT 。但是 BETWEEN 也有缺陷,如果 id 中間有斷行或是部分 id 不讀取的情況,總讀取的數量會少於預計數量! 在讀取比較后面的數據時,通過 DESC 方式把數據反向查找,以減少對前端數據的掃描,讓 LIMIT 的基數越少越好!  

 

原則七:不要使用 RAND 函數獲取多條隨機記錄。

例如:

SELECT * FROM table ORDER BY RAND() LIMIT 20;

 

使用下面的語句代替:

SELECT * FROM table AS t1
JOIN (
  SELECT ROUND(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查詢。  

 

原則八:避免使用NULL。  

原則九:不要使用 COUNT(id) ,而應該是 COUNT(*)。  

原則十:不要做無謂的排序操作,而應盡可能在索引中完成排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM