針對數據庫索引的優化
本文主要對索引的創建及使用做詳細描寫敘述,至於為什麽要使用索引、使用索引帶來哪些優點、索引的分類等內容這裏不再贅述,假設想知道請參考相關文檔。
一、怎樣正確的創建索引
1、對主鍵、外鍵 建立索引
因為開發中常常通過主鍵或者外鍵去查找某條或者多條記錄,所以須要對主鍵、外鍵建立索引
2、對於常常出如今查詢條件中的字段建立索引
對於常常出如今查詢條件中的字段建立索引往往能提高查詢效率
3、結合須要返回的字段創建索引
對於須要查詢結果返回的字段建立組合索引能夠不用查詢數據表就能夠得到數據。比如:select id,name,code from student where id=? 。假設對id,name,code建立索引的話,直接查詢索引表就能夠得到想要的數據了,這時就不用再訪問student表。
創建索引的經常使用註意事項有這麽幾個。創建索引當然不是越多越好。假設創建索引不當,還會導致查詢效果比沒有創建索引還低,或者索引表的數據比數據表的數據還大,所以使用須要須要小心慎重。
下邊給出一個索引創建指引表:
|
字段類型 |
常見字段名 |
須要建索引的字段 |
主鍵 |
ID,PK |
外鍵 |
PRODUCT_ID,COMPANY_ID,MEMBER_ID,ORDER_ID,TRADE_ID,PAY_ID |
|
有對像或身份標識意義字段 |
HASH_CODE,USERNAME,IDCARD_NO,EMAIL,TEL_NO,IM_NO |
|
索引慎用字段,須要進行數據分布及使用場景具體評估 |
日期 |
GMT_CREATE,GMT_MODIFIED |
年月 |
YEAR,MONTH |
|
狀態標誌 |
PRODUCT_STATUS,ORDER_STATUS,IS_DELETE,VIP_FLAG |
|
類型 |
ORDER_TYPE,IMAGE_TYPE,GENDER,CURRENCY_TYPE |
|
區域 |
COUNTRY,PROVINCE,CITY |
|
操作人員 |
CREATOR,AUDITOR |
|
數值 |
LEVEL,AMOUNT,SCORE |
|
長字符 |
ADDRESS,COMPANY_NAME,SUMMARY,SUBJECT |
|
不適合建索引的字段 |
描寫敘述備註 |
DESCRIPTION,REMARK,MEMO,DETAIL |
大字段 |
FILE_CONTENT,EMAIL_CONTENT |
二、怎樣正確的使用索引
1、避免在where 子句中對字段進行is null 推斷。這樣將使引擎放棄使用索引而是全表掃描數據
2、避免在where子句中對字段進行不等潘丹(<>、 !=)。否則相同使用引擎全表掃描
3、避免在where子句中對字段進行or,in 推斷。相同導致引擎全表掃描數據
建議使用union取代,例如以下樣例,前提是code是索引
不建議使用的語句:select id from student where code = ‘000012‘ or code = ‘000015‘
建議使用的語句: select id from student where code = ‘000012‘ union all select id from student where code = ‘000015‘
4、避免在where 子句中對字段進行not in,not exists 的推斷,相同導致索引失效
5、避免在where子句中對字段進行表達式操作(函數算法計算)。相同導致索引失效
比如:select id from student where DATEDIFF(SYSDATE,createDate) > 30
select id from student where col/2 =15
6、使用Like時,避免使用非字母開頭檢索
比如:select id from student where name like ‘%王%‘ 應該使用select id from student where name like ‘王%‘
7、在使用索引字段作為條件時。假設該索引是復合索引,那麽必須使用到該索引中的第一個字段作為條件時才幹保證系統使用該索引,否則該索引將不會被使用,而且應盡可能的讓查詢字段順序與索引順序相一致。
PS:上邊標註紅色的第三條為五六年前數據庫運行的標準。如今數據庫一般都支持對in 或者 or 的索引查詢。
針對數據庫索引的優化