sql的簡單提高效率方法

2021-07-02 00:28:37 字數 2630 閱讀 3129

少用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 回訪優化程序

資料變化後,重新考察優化情況

如何提高效率

如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...

Python 提高效率

最近師兄給了小任務,算乙個p值。任務詳情是這樣的 第一步,有基因集a,23個元素,基因集b,451個元素,共有23 451 9922個組合 當然你要考慮去重 看在ppi資料庫 145萬多行資料 中出現的組合總個數 觀察值 第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c...

如何提高效率

在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...