索引建立方式

2021-08-21 04:52:17 字數 1530 閱讀 2819

今天的工作中因一張表資料量在100w上下(後續資料量還會不斷增加)欲優化查詢速度,決定給表中新增索引。

oracle的索引分為5種:唯一索引,組合索引,反向鍵索引,位圖索引,基於函式的索引

建立索引:create [unique] index index_name on table (column)

unique --唯一索引

index_name --索引名稱

table --表名

column (列)

刪除索引:drop index [schema.]indexname

索引是什麼?

索引可當作是一本書的目錄,乙個表中的某列加了索引相當於在乙個小表中單獨記錄了此列的資訊,在查詢大表時根據這個」目錄「記載的rowid可以很快的找到對應的資料。

那麼什麼時候該建立索引又該建立什麼索引呢?

1、表資料量大的情況下 (只有個幾百條資料的情況下加了索引也沒有什麼感覺)

2、插入修改刪除不頻繁的業務表(開頭說了索引列是要跟小表有乙個關聯的,如果頻繁的增刪改,小表也要進行修改,所以dml的語句會降低效率)

3、經常要把哪幾個字段拿來進行查詢或者排序這個時候可以考慮建立索引(唯一性越強的字段越適合加索引比如主鍵)

4、資料重複多的話用位圖索引(比如性別、科室、類別等)

5、選擇性次一級的可以使用復合索引(比如姓名,家庭住址,時間等)

這裡使用復合索引要把選擇性強的索引來放組合的前面,選擇性強的就是可以大量篩除資料的字段

注:oracle自oracle 10g開始已經丟棄了rbo優化器,使用了cbo。所以在

mysql

中組合查詢要遵守的前導列查詢在10g之後可不用遵守。即表test中有組合索引a,b,c,d 在mysql中where條件中必須a欄位放到第一位上,如果查詢bcd,或者bacd都不會走索引。

6、這個時候我想到如果既有單字段索引,又有這幾個欄位上的復合索引,那直接建立乙個大的復合索引就好了啊,實際情況卻並不是想象的那麼美好,在執行計畫中,在有單字索引的時候,就不會走復合索引了,但是如果直接建立乙個大的復合索引的話執行的效率卻又沒有選擇性強的單字索引效率來的快,所以出現單字索引和復合索引有交叉的情況下一般刪除復合索引(具體情況視業務來定)。

7、經常與其他表進行連線的表,在連線欄位上應該建立索引。

為什麼某些列查詢時檢視執行計畫並沒有走索引??

今天在乙個時間列上加了索引在檢視執行計畫發現並沒有走索引而是full的全表,百思不得其解,且使用了hint了以後效率也並沒有增加多少。

後來發現到問題還是出在了先前說過的選擇性上面,在查詢時,如果回表資料大於表資料的15%(待考證)或者更多oracle的優化器會自己選擇full全表而不會通過索引查詢,這個時候如果想使用索引需要使用hint。(但是優化結果可能達不到想要的結果)

在縮小了時間點後,減少了回表資料,果然又走了索引

pandas建立多重索引的幾種方式

使用pandas建立多重索引的方式有很多,下面舉出常見的幾種 1 pd.multiindex.from tuples方法 import pandas as pd import numpy as np arrays bar bar baz baz foo foo qux qux one two one...

c mysql建立索引 MySQL 建立索引

1 索引建立原則 1 搜尋的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在where子句中的列,或連線子句中指定的列,而不是出現在select關鍵字後的選擇列表中的列。2 使用唯一索引。考慮某列中值的分布。索引的列的基數越大,索引的效果越好。3 使用短索引。如果對字串列進行索引,應該...

MySQL索引型別及建立方式的總結

mysql索引型別及建立方式的總結 1 mysql索引型別包括 普通索引 唯一索引 全文索引 單列索引 多列索引和空間索引。2 索引的建立有利有弊,建立索引可以提高查詢速度,但過多的建立索引則會佔據許多的磁碟空間。3 mysql通過三種方式來建立索引,分別為建立表時建立索引 在已經存在的表上建立索引...