少用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 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...