1. 程式人生 > >sql查詢效能優化

sql查詢效能優化

1.部分UPDATE、SELECT 語句寫得很複雜(經常巢狀多級子查詢)——可以考慮適當拆成
幾步,先生成一些臨時資料表,再進行關聯操作;
生成臨時表create temporary table tmp_table()
生成的臨時表將在你連線MySQL期間存在。當你斷開時,
MySQL將自動刪除表並釋放所用的空間

1.1.避免頻繁建立和刪除臨時表,以減少系統表資源的消耗                    

2.經常發現有不少後臺程式的效能問題是因為缺少合適索引造成的
前期在開發階段,資料量較少,影響不大,隨著時間的推移數
據量越來越龐大,缺少索引對效能影響會越來越大;

    索引使資料庫程式無須對整個表進行掃描,就可以在其中找到
    所需的資料。當進行資料檢索時,系統先搜尋索引,從中找到
    資料的指標,再直接通過指標從表中取資料
        建立索引create index 索引名 on 表名(欄位1,欄位2);

3.對where條件進行優化

    3.1 可以使用 exist 和not exist代替 in和not in,extist可以用到索引
NOT IN都是最低效的 (因為它對子查詢中的表執行了一個全表遍歷
exist與in用的場合區別
            子查詢集合資料量龐大時用exist,相反情況用in



    3.2用where替代having,因為having是分組篩選,用having就一定要和group by連用
        不能group by的話,預設整個表個一組

    3.3應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描

    3.4應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
        select name from table where classify is null;
        可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢: 
        select id from t where num=0 

    3.5應儘量避免在where子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描
    3.6不要在 where 子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。

    3.7.應儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如: 
            select id from t where num=10 or num=20 
                可以這樣查詢: 
            select id from t where num=10 
                union all 
            select id from t where num=20 
        union 與union all的區別,
            都是兩個結果集合並
            union會錶鏈接後去重,nuion all不會去重
            union會對欄位進行排序,而union all直接返回結果
            所以使用union all比union快

4.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引 ??????

5.當索引列有大量資料重複時,SQL查詢可能不會去利用索引;

6.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引;

7.儘量使用數字型欄位,若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線時會逐個比較字串中每一個字元,而對於數字型而言只需要比較一次就夠了;

8.儘量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理

9.IO永遠是資料庫最容易瓶頸的地方,這是由資料庫的職責所決定的,大部分資料庫操作中超過90%的時間都是 IO 操作所佔用的,減少 IO 次數是 SQL 優化中需要第一優先考慮,當然,也是收效最明顯的優化手段

10.除了 IO 瓶頸之外,SQL優化中需要考慮的就是 CPU 運算量的優化了。order by, group by,distinct … 都是消耗 CPU 的大戶(這些操作基本上都是 CPU 處理記憶體中的資料比較運算)。

11.靜態錶速度更快,類似char是固定長度和varchar不是
靜態表字段長度固定,自動填充,讀寫速度很快,便於快取和修復,但比較佔硬碟,
動態表是欄位長度不固定,節省硬碟,但更復雜,容易產生碎片,速度慢,出問題後不容易重建。

12.我們在多個表進行分頁資料查詢的時候,我們最好是能夠在一個表上先過濾好資料分好頁,
然後再用分好頁的結果集與另外的表 Join連線查詢;

13.MySQL比較擅長單表簡單查詢,儘量少用複雜的多表join

14.MySQL中可以使用連線查詢來代替子查詢。連線查詢不需要建立臨時表,其速度比子查詢要快。所以相比子查詢儘量多使用join

15.拆分大的DELETE和INSERT語句

因為這兩個操作是會鎖表的,對於高訪問量的站點來說,鎖表時間內積累的訪問數、資料庫連線、
開啟的檔案數等等,可能不僅僅讓WEB服務崩潰,還會讓整臺伺服器馬上掛了。

所以,一定要拆分,使用LIMIT條件休眠一段時間,批量處理。

http://www.cnblogs.com/lddbupt/p/5781831.html