編寫高性能的SQL語句注意事項
前言
在應(yīng)用系統(tǒng)開發(fā)初期,由于開發(fā)數(shù)據(jù)庫數(shù)據(jù)比較少,對于查詢SQL語句,復(fù)雜視圖的的編寫等體會不出SQL語句各種寫法的性能優(yōu)劣,但是如果將應(yīng) 用系統(tǒng)提交實際應(yīng)用后,隨著數(shù)據(jù)庫中數(shù)據(jù)的增加,系統(tǒng)的響應(yīng)速度就成為目前系統(tǒng)需要解決的最主要的問題之一。系統(tǒng)優(yōu)化中一個很重要的方面就是SQL語句的 優(yōu)化。對于海量數(shù)據(jù),劣質(zhì)SQL語句和優(yōu)質(zhì)SQL語句之間的速度差別可以達到上百倍,可見對于一個系統(tǒng)不是簡單地能實現(xiàn)其功能就可,而是要寫出高質(zhì)量SQL語句,提高系統(tǒng)的可用性。
在多數(shù)情況下,數(shù)據(jù)庫使用索引來更快地遍歷表,優(yōu)化器主要根據(jù)定義的索引來提高性能。但是,如 果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優(yōu)化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質(zhì)SQL語句。在編寫 SQL語句時我們應(yīng)清楚優(yōu)化器根據(jù)何種原則來刪除索引,這有助于寫出高性能的SQL語句。
索引有哪些種類?
常見的索引有B-TREE索引、位圖索引、全文索引。
B-TREE索引也稱為平衡樹索引(Balance Tree),它是一種按字段排好序的樹形目錄結(jié)構(gòu),主要用于提升查詢性能和唯一約束支持;B-TREE索引包括很多擴展類型,如組合索引、反向索引、函數(shù)索引等等;B-TREE索引的內(nèi)容包括根節(jié)點、分支節(jié)點、葉子節(jié)點。
位圖索引一般用于數(shù)據(jù)倉庫應(yīng)用。
一個表中可以建多個索引,就如一本字典可以建多個目錄一樣(按拼音、筆劃、部首等等)。
一個索引也可以由多個字段組成,稱為組合索引,如上圖就是一個按部首+筆劃的組合目錄。
SQL語句中,什么條件會使用索引?
當(dāng)字段上建有索引時,通常以下情況會使用索引:
INDEX_COLUMN = ? (或者>、>=、<、<=)
INDEX_COLUMN between ? and ?
INDEX_COLUMN IN (?,?,...,?)
INDEX_COLUMN like ?||'%'(后導(dǎo)模糊查詢)
T1. INDEX_COLUMN=T2. COLUMN1(兩個表通過索引字段關(guān)聯(lián))
SQL語句中,什么條件不會使用索引?
查詢條件 不能使用索引原因
INDEX_COLUMN <> ?
INDEX_COLUMN not in (?,?,...,?) 不等于操作不能使用索引
function(INDEX_COLUMN) = ?
INDEX_COLUMN + 1 = ?
INDEX_COLUMN || 'a' = ? 經(jīng)過普通運算或函數(shù)運算后的索引字段不能使用索引,但是經(jīng)過函數(shù)運算字段的字段要使用可以使用函數(shù)索引
INDEX_COLUMN like '%'||?
INDEX_COLUMN like '%'||?||'%' 含前導(dǎo)模糊查詢的Like語法不能使用索引
INDEX_COLUMN is null B-TREE索引里不保存字段為NULL值記錄,因此IS NULL不能使用索引
NUMBER_INDEX_COLUMN='12345'
CHAR_INDEX_COLUMN=12345 在做數(shù)值比較時需要將兩邊的數(shù)據(jù)轉(zhuǎn)換成同一種數(shù)據(jù)類型,如果兩邊數(shù)據(jù)類型不同時會對字段值隱式轉(zhuǎn)換,相當(dāng)于加了一層函數(shù)處理,所以不能使用索引。
a.INDEX_COLUMN=a.COLUMN_1 給索引查詢的值應(yīng)是已知數(shù)據(jù),不能是未知字段值。
注意:有時候我們會使用多個字段的組合索引,如果查詢條件中第一個字段不能使用索引,那整個查詢也不能使用索引。
|
|