sql的簡單提高效率方法,sql提高效率

來源:互聯網
上載者:User

sql的簡單提高效率方法,sql提高效率

少用in操作(效率極差),盡量用表關聯代替

select要指定列,不要*(*會讀入所有資料,而指定列則只提取涉及的列,減少io)

盡量有where(減少讀取量),where操作列盡量有索引(加快查詢)

    (mysql索引使用B-Tree資料結構對特定列額外組織存放,加快儲存引擎尋找記錄的速度,不需回表查詢資料的就是聚簇索引(索引和資料存放在一起)。通常是需要回表再查資料,需要消耗額外的磁碟IO。)

主鍵是特殊的唯一索引(不含null),唯一索引更好用

複合索引設計合理,比多列索引強。因為多列索引在where中引用時,列順序非常重要,要滿足最左首碼列,左邊優先,不一定能構建合理的索引。

        (最左首碼:查詢條件中的所有欄位需要從左邊起按順序出現在多列索引中,查詢條件的欄位數要小於等於多列索引的欄位數,中間欄位不能     存在範圍查詢的欄位(<,like等),這樣的sql可以使用該多列索引。)

盡量不用like,用like時萬用字元不開頭,盡量建立首碼索引(萬用字元位置之前的字串)

盡量不order by


懶得寫了,整理一個篇網上的還可以的

1 避免全表掃描

  進行全表掃描情況:
-          無索引
-          返回行無限制條件(無Where子句)
-          索引主列(索引的第一列)無限制條件
-          索引主列的限制條件被包含在運算式中
-          索引主列的限制條件是is (not) null或!=
-          索引主列的限制條件是like操作且值是一個bind variable或%打頭的值


2 只用選擇性索引
   索引選擇性是指索引列中不同值的數和表中記錄數的比。如果表中2000條記錄,索引列有1980個不同的值,那索引選擇性是1980/2000=0.99。越接近於1,這個索引的效率就越高。
   列的選擇性=不同值的數目/行的總數 /* 越接近1越好 */
    複合索引中列的次序的問題:
  1 在限定條件裡最頻繁使用的列應該是主列
  2 最具有選擇性的列(即最清晰的列)應該是主列
  如果1和2 不一致,可以考慮建立多個索引。
在複合索引和多個單個索引中作選擇: 考慮選擇性 考慮讀取索引的次數  考慮AND-EQUAL操作
 3 管理多表串連(Nested Loops, Merge Joins和Hash Joins)  
最佳化聯結操作
  Merge Joins是集合操作  Nested Loops和Hash Joins是記錄操作返回第一批記錄迅速
  Merge Joins的操作適用於批處理操作,巨大表 和遠程查詢
1全表掃描  --〉 2排序   --〉3比較和合并  效能開銷主要在前兩步
  適用全表掃描的情形,都適用Merge Joins操作(比Nested Loops有效)。
  改善1的效率: 最佳化I/O, 提高使用ORACLE多塊讀的能力, 使用並行查詢的選項
  改善1的效率:提高Sort_Area_Size的值, 使用Sort Direct Writes,為臨時段提供專用資料表空間
4 管理組件含視圖的SQL語句
  最佳化器執行包含視圖的SQL語句有兩種方法:
-          先執行視圖,完成全部的結果集,然後用其餘的查詢條件作過濾器執行查詢
-          將視圖文本整合到查詢裡去
含有group by子句的視圖不能被整合到一個大的查詢中去。
在視圖中使用union,不阻止視圖的SQL整合到查詢的文法中去。
5 最佳化子查詢
6 使用複合Keys/Star查詢
7 恰當地索引Connect By操作
8 限制對遠端資料表的訪問
9 管理非常巨大的表的訪問
-          管理資料接近(proximity) 記錄在表中的存放按對錶的範圍掃描中最長使用的列排序 按次序儲存資料有助於範圍掃描,尤其是對大表。
-          避免沒有協助的索引掃描 當返回的資料集合較大時,使用索引對SGA的資料區塊緩衝佔用較大,影響其他使用者;全表掃描還能從ORACLE的多塊讀取機制和“一致性擷取/每塊”特性中受益。
-          建立充分索引的表  使訪問索引能夠讀取較全面的資料  建立僅主列不同的多個索引
-          建立hash簇
-          建立分割表和視圖
-          使用並行選項
10 使用Union All 而不是Union
   UNION ALL操作不包括Sort Unique操作,第一行檢索的響應速度快,多數情況下不用臨時段完成操作,
   UNION ALL建立的視圖用在查詢裡可以整合到查詢的文法中去,提高效率
11 避免在SQL裡使用PL/SQL功能調用
12 綁定變數(Bind Variable)的使用管理
   使用Bind Variable和Execute using方式
   將like :name ||’%’ 改寫成 between :name and :name || char(225), 已避免進行全表掃描,而是使用索引。
13 回訪最佳化進程
   資料變化後,重新考察最佳化情況

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.