資料庫應用優化(一)

最閒的碼農發表於2019-02-26

1.儘量避免在列上進行運算,這樣會導致索引失效。例如原句為:

    SELECT * FROM table WHERE YEAR(d) >= 2019;
    //優化為
    SELECT * FROM table WHERE d>='2019-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模糊查詢的時,避免%%,SQL語句並未用到索引,而且是全表搜尋。例如原句為:

    SELECT * FROM table WHRER name LIKE '%keyword%'
    //優化為
    SELECT column FROM table WHERE name like ‘keyword%’
  1. 查詢時儘量用自己需要的欄位,這對查詢速度不會有什麼影響,但可以節省記憶體。例如原句為:

    SELECT * FROM table
    //優化為
    SELECT username,password FROM table

5.批量插入語句節省互動。例如原句為:

        INSERT INTO (id,name) VALUES (1,a);
        INSERT INTO (id,name) VALUES (2,b);
        INSERT INTO (id,name) VALUES (3,c);
        //優化為
        INSERT INTO (id,name) VALUES (1,a), (2,b),(3,c)

6.limit基數比較大時使用between。例如原句為:

     SELECT username,password FROM table limit 1000000,10
     //優化為
     SELECT username,password FROM table where id between  1000000 and 1000010
     //between限定比limit快,所以海量資料訪問時,建議用between或者where替換掉limit,但是between也有缺陷,如果id不連續。總讀取的資料會少於預計資料

7.建議不實用rand隨機獲取多條記錄
8.避免使用NULL
9.不要使用count(id),可以直接count(*)
10.不要做無所謂的排序操作

          ♦️合理設計和使用索引
          ♦️在關鍵字的索引上,建與不建索引,查詢速度相差100倍
          ♦️差的索引和沒有索引效果一樣
          ♦️索引並非越多越好,因為維護索引需要成本
          ♦️每個表的索引應在5個以下,應合理利用部分索引和聯合索引
          ♦️不在結果集中的結果單一的列上建立索引
          ♦️建索引的欄位結果集最好分佈均勻,或者符合正態分佈

相關文章