1.儘量避免在列上進行運算,這樣會導致索引失效。
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.僅列出需要查詢的字段,這對速度不會有明顯影響,主要考慮節省內存。
5.使用批量插入語句節省交互。
6.limit的基數比較大時使用between。
例如:
SELECT * FROM article order by id limit 1000000,10
優化爲
SELECT * FROM article WHERE id between 1000000 and 1000010 order 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 ROUND (rand() * ((SELCT 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.不要做無謂的排序操作,而應儘可能在索引中完成排序。