當前位置:首頁 » 服務存儲 » 怎麼存儲背包索引
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

怎麼存儲背包索引

發布時間: 2022-05-03 09:21:47

⑴ 索引怎麼建立使用

Create Relational Index
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

參數
UNIQUE
為表或視圖創建唯一索引。唯一索引不允許兩行具有相同的索引鍵值。視圖的聚集索引必須唯一。

無論 IGNORE_DUP_KEY 是否設置為 ON,資料庫引擎都不允許為已包含重復值的列創建唯一索引。否則,資料庫引擎會顯示錯誤消息。必須先刪除重復值,然後才能為一列或多列創建唯一索引。唯一索引中使用的列應設置為 NOT NULL,因為在創建唯一索引時,會將多個 Null 值視為重復值。

CLUSTERED
創建索引時,鍵值的邏輯順序決定表中對應行的物理順序。聚集索引的底層(或稱葉級別)包含該表的實際數據行。一個表或視圖只允許同時有一個聚集索引。

具有唯一聚集索引的視圖稱為索引視圖。為一個視圖創建唯一聚集索引會在物理上具體化該視圖。必須先為視圖創建唯一聚集索引,然後才能為該視圖定義其他索引。

在創建任何非聚集索引之前創建聚集索引。創建聚集索引時會重新生成表中現有的非聚集索引。

如果沒有指定 CLUSTERED,則創建非聚集索引。

注意:
因為按照定義,聚集索引的葉級別與其數據頁相同,所以創建聚集索引和使用 ON partition_scheme_name 或 ON filegroup_name 子句實際上會將表從創建該表時所在的文件組移到新的分區方案或文件組中。對特定的文件組創建表或索引之前,應確認哪些文件組可用並且有足夠的空間供索引使用。

NONCLUSTERED
創建一個指定表的邏輯排序的索引。對於非聚集索引,數據行的物理排序獨立於索引排序。

無論是使用 PRIMARY KEY 和 UNIQUE 約束隱式創建索引,還是使用 CREATE INDEX 顯式創建索引。每個表都最多可包含 999 個非聚集索引。

對於索引視圖,只能為已定義唯一聚集索引的視圖創建非聚集索引。

默認值為 NONCLUSTERED。

index_name
索引的名稱。索引名稱在表或視圖中必須唯一,但在資料庫中不必唯一。索引名稱必須符合標識符的規則。

column
索引所基於的一列或多列。指定兩個或多個列名,可為指定列的組合值創建組合索引。在 table_or_view_name 後的括弧中,按排序優先順序列出組合索引中要包括的列。

一個組合索引鍵中最多可組合 16 列。組合索引鍵中的所有列必須在同一個表或視圖中。組合索引值允許的最大大小為 900 位元組。

不能將大型對象 (LOB) 數據類型 ntext、text、varchar(max)、 nvarchar(max)、varbinary(max)、xml 或 image 的列指定為索引的鍵列。另外,即使 CREATE INDEX 語句中並未引用 ntext、text 或 image 列,視圖定義中也不能包含這些列。

如果 CLR 用戶定義類型支持二進制排序,則可以為該類型的列創建索引。另外,對於已定義為用戶定義類型列的方法調用的計算列,只要這些方法標記為確定性方法且不執行數據訪問操作,便可為該計算列創建索引。

[ ASC | DESC ]
確定特定索引列的升序或降序排序方向。默認值為 ASC。

INCLUDE ( column [ ,...n ] )
指定要添加到非聚集索引的葉級別的非鍵列。非聚集索引可以唯一,也可以不唯一。

在 INCLUDE 列表中列名不能重復,且不能同時用於鍵列和非鍵列。

除 text、ntext 和 image 之外,允許所有數據類型。如果指定的任一非鍵列屬於 varchar(max)、nvarchar(max) 或 varbinary(max) 數據類型,則必須離線 (ONLINE = OFF) 創建或重新生成該索引。

精確或不精確的確定性計算列都可以是包含列。從 image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 和 xml 數據類型派生的計算列可以包含在非鍵列中,前提是允許將這些計算列數據類型作為包含列。

WHERE <filter_predicate>
通過指定索引中要包含哪些行來創建篩選索引。篩選索引必須是對表的非聚集索引。為篩選索引中的數據行創建篩選統計信息。

篩選謂詞使用簡單比較邏輯且不能引用計算列、UDT 列、空間數據類型列或 hierarchyID 數據類型列。比較運算符不允許使用 NULL 文本的比較。請改用 IS NULL 和 IS NOT NULL 運算符。

下面是 Proction.BillOfMaterials 表的篩選謂詞的一些示例:

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

篩選索引不適用於 XML 索引和全文索引。對於 UNIQUE 索引,僅選定的行必須具有唯一的索引值。篩選索引不允許有 IGNORE_DUP_KEY 選項。

ON partition_scheme_name ( column_name )
指定分區方案,該方案定義要將分區索引的分區映射到的文件組。必須通過執行 CREATE PARTITION SCHEME 或 ALTER PARTITION SCHEME,使資料庫中存在該分區方案。column_name 指定將作為分區索引的分區依據的列。該列必須與 partition_scheme_name 使用的分區函數參數的數據類型、長度和精度相匹配。column_name 不限於索引定義中的列。除了在對 UNIQUE 索引分區時,必須從用作唯一鍵的列中選擇 column_name 外,還可以指定基表中的任何列。通過此限制,資料庫引擎可驗證單個分區中的鍵值唯一性。

注意:
在對非唯一的聚集索引進行分區時,如果尚未指定分區依據列,則默認情況下資料庫引擎將在聚集索引鍵列表中添加分區依據列。在對非唯一的非聚集索引進行分區時,如果尚未指定分區依據列,則資料庫引擎會添加分區依據列作為索引的非鍵(包含)列。

如果未指定 partition_scheme_name 或 filegroup 且該表已分區,則索引會與基礎表使用相同分區依據列並被放入同一分區方案中。

有關將索引分區的詳細信息,請參閱已分區索引的特殊指導原則。

ON filegroup_name
為指定文件組創建指定索引。如果未指定位置且表或視圖尚未分區,則索引將與基礎表或視圖使用相同的文件組。該文件組必須已存在。

ON "default"
為默認文件組創建指定索引。

在此上下文中,「default」不是關鍵字。它是默認文件組的標識符,並且必須進行分隔(類似於 ON "default" 或 ON[default])。如果指定了 "default",則當前會話的 QUOTED_IDENTIFIER 選項必須為 ON。這是默認設置。
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
在創建聚集索引時,指定表的 FILESTREAM 數據的位置。FILESTREAM_ON 子句用於將 FILESTREAM 數據移動到不同的 FILESTREAM 文件組或分區方案。

filestream_filegroup_name 是 FILESTREAM 文件組的名稱。該文件組必須包含一個使用 CREATE DATABASE 或 ALTER DATABASE 語句為該文件組定義的文件;否則,將引發錯誤。

如果表已分區,則必須包含 FILESTREAM_ON 子句並且必須指定 FILESTREAM 文件組的分區方案,且此分區方案需使用與該表分區方案相同的分區函數和分區列。否則將引發錯誤。

如果該表未分區,則無法對 FILESTREAM 列分區。該表的 FILESTREAM 數據必須存儲在一個由 FILESTREAM_ON 子句指定的文件組中。

如果創建的是聚集索引且該表不包含 FILESTREAM 列,則可在 CREATE INDEX 語句中指定 FILESTREAM_ON NULL。

⑵ 資料庫索引有哪幾種,怎樣建立索引

資料庫索引的種類:

1、按照索引列值的唯一性,索引可分為唯一索引和非唯一索引

非唯一索引:B樹索引

create index 索引名 on 表名(列名) tablespace 表空間名;

唯一索引:建立主鍵或者唯一約束時會自動在對應的列上建立唯一索引

2、索引列的個數:單列索引和復合索引

3、按照索引列的物理組織方式

B樹索引

create index 索引名 on 表名(列名) tablespace 表空間名;

點陣圖索引

create bitmap index 索引名 on 表名(列名) tablespace 表空間名;

反向鍵索引

create index 索引名 on 表名(列名) reverse tablespace 表空間名;

函數索引

create index 索引名 on 表名(函數名(列名)) tablespace 表空間名;

刪除索引

drop index 索引名

重建索引

alter index 索引名 rebuild


索引的創建格式:

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>
ON <schema>.<table_name>
(<column_name> | <expression> ASC | DESC,
<column_name> | <expression> ASC | DESC,...)
TABLESPACE <tablespace_name>
STORAGE <storage_settings>
LOGGING | NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS | COMPRESS<nn>
NOSORT | REVERSE
PARTITION | GLOBAL PARTITION<partition_setting>

UNIQUE | BITMAP:指定UNIQUE為唯一值索引,BITMAP為點陣圖索引,省略為B-Tree索引。
<column_name> | <expression> ASC | DESC:可以對多列進行聯合索引,當為expression時即「基於函數的索引」
TABLESPACE:指定存放索引的表空間(索引和原表不在一個表空間時效率更高)
STORAGE:可進一步設置表空間的存儲參數
LOGGING | NOLOGGING:是否對索引產生重做日誌(對大表盡量使用NOLOGGING來減少佔用空間並提高效率)
COMPUTE STATISTICS:創建新索引時收集統計信息
NOCOMPRESS | COMPRESS<nn>:是否使用「鍵壓縮」(使用鍵壓縮可以刪除一個鍵列中出現的重復值)
NOSORT | REVERSE:NOSORT表示與表中相同的順序創建索引,REVERSE表示相反順序存儲索引值
PARTITION | NOPARTITION:可以在分區表和未分區表上對創建的索引進行分區

使用USER_IND_COLUMNS查詢某個TABLE中的相應欄位索引建立情況

使用DBA_INDEXES/USER_INDEXES查詢所有索引的具體設置情況。

在Oracle中的索引可以分為:B樹索引、點陣圖索引、反向鍵索引、基於函數的索引、簇索引、全局索引、局部索引等,下面逐一講解:

一、B樹索引:

最常用的索引,各葉子節點中包括的數據有索引列的值和數據表中對應行的ROWID,簡單的說,在B樹索引中,是通過在索引中保存排過續的索引列值與相對應記錄的ROWID來實現快速查詢的目的。其邏輯結構如圖:

反向鍵索引是一種特殊的B樹索引,在存儲構造中與B樹索引完全相同,但是針對數值時,反向鍵索引會先反向每個鍵值的位元組,然後對反向後的新數據進行索引。例如輸入2008則轉換為8002,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。

反向鍵索引的創建示例:

createindex ind_t on t1(id) reverse;

註:鍵的反轉由系統自行完成。對於用戶是透明的。

四、基於函數的索引:

有的時候,需要進行如下查詢:select * from t1 where to_char(date,'yyyy')>'2007';

但是即便在date欄位上建立了索引,還是不得不進行全表掃描。在這種情況下,可以使用基於函數的索引。其創建語法如下:

create index ind_t on t1(to_char(date,'yyyy'));

註:簡單來說,基於函數的索引,就是將查詢要用到的表達式作為索引項。

五、全局索引和局部索引:

這個索引貌似很復雜,其實很簡單。總得來說一句話,就是無論怎麼分區,都是為了方便管理。

具體索引和表的關系有三種:

1、局部分區索引:分區索引和分區表1對1

2、全局分區索引:分區索引和分區表N對N

3、全局非分區索引:非分區索引和分區表1對N

創建示例:

首先創建一個分區表

createtable student

(

stuno number(5),

sname vrvhar2(10),

deptno number(5)

)

partition by hash (deptno)

(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

創建局部分區索引(1v1):

create index ind_t on student(stuno)

local(

partition part_01 tablespace A2,

partition part_02 tablespace A1

);--local後面可以不加

創建全局分區索引(NvN):

create index ind_t on student(stuno)

globalpartition by range(stuno)

(

partition p1 values less than(1000) tablespace A1,

partition p2 values less than(maxvalue) tablespace A2

);--只可以進行range分區

創建全局非分區索引(1vN)

createindex ind_t on student(stuno) GLOBAL;

⑶ 存儲在HDFS上的文件如何構建索引

非常感覺您的回答。solr原理只是說了可以通過MR構建索引,但是如何通過MR批量構建索引(有簡單的可以運行的例子嗎?)我還是不太清楚,新手剛接觸這方面,多多包涵!是只要在solr上配置hdfs路徑就可以自己構建索引還是要自己寫代碼提交MR任務?直接通過MR從hdfs上讀取數據構建索引和在hbase構建索引哪種方式好些?

⑷ 按照存儲結構劃分,索引分為哪兩類各有何作用

聚集索引:對表在物理數據頁中的數據排列進行排序,然後重新存儲到磁碟上,表中的數據行只能以一種方式存儲在磁碟上,故一個表只能有一個聚集索引。創建任何非聚集索引之前必須創建聚集索引。

非聚集索引:具有完全獨立於數據行的結構,使用非聚集索引不會影響數據表中記錄的實際存儲順序。



(4)怎麼存儲背包索引擴展閱讀

優點

1.大大加快數據的檢索速度;

2.創建唯一性索引,保證資料庫表中每一行數據的唯一性;

3.加速表和表之間的連接;

4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

缺點

1.索引需要佔物理空間。

2.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。

⑸ 索引一般以文件形式存儲在磁碟上,怎麼存

這要看是哪類索引文件了,不同的程序,建立索引文件的格式也會是不同的。保存和調用的方法,也是由程序所決定的。

⑹ 定量背包PASCAL

如果K是未指定的,
f(m,volume) = 0 m=0時
f(m,volume) = f(m-1,volume) volume-vol[m]<0時
f(m,volume)
= max { value[m]+f(m-1,volume-vol[m]) , f(m-1,volume) }
f(m,volume)指從編號為1到m的物品中選取總體積不超過volume的物品所能達到的最大價值。
f(N,V)即為所求。

如果K是指定的,
f(m,L,volume)
= max { value[m]+f(m-1,L-1,volume-vol[m]) , f(m-1,L,volume)}
f(m,L,volume) = 0 l=0或m<l時
f(m,L,volume) = f(m-1,L,volume) volume-vol[m]<0時
f(m,L,volume)指從編號為1到m的物品中選取總體積不超過volume的L個物品所能達到的最大價值。
f(N,K,V)即為所求。
至於記錄選取物品情況,可以用字元串或數組記錄。如N=8,現在從1到6中選,如果選取6,從1到5中選取的結果是00001010,不選6,從1到5中選取的結果是00010011,那麼就看00101010(第6位置1)和00010011哪個的價值大,便把所求的f和相應的串作為返回值。
有很多地方重復計算了,可以優化剪枝,不過程序就會比較復雜了。

補充:

我說的K未指定時的方法實際上就是6樓所用到的方法,從編號為1到i的物品中取出總體積不超過t的物品使得總價值最大,無非分兩種情形,一種是不取物品n,從1到n-1中選取總體積不超過t的物品使價值最大;另一種是選取物品i,然後從1到i-1中選取總體積不超過t-tt[i]的物品使價值最大。這兩種情況中總價值更大的那個即為所求。

本來這是要用遞歸來完成的,非遞歸方法則要用到棧,但是若每個物品的體積都是正整數的話,則可以用遞推方法來完成。6樓正是用的此種方法。

二重循環中,外層循環是物品編號1到N,內層循環是體積V到0,其中i=k一個循環下來,數組b[]的每個元素b[j]中存儲了從物品1到k中選取物品使得體積之和剛好為j,所能達到的最大價值,若a[j]=false,則表示無法選取物品組合使得體積之和恰好為j,此時相對應的b[j]=0。

例如物品5的體積為tt[5]=8,價值為w[5]=13,i=4循環結束時,b[8]=0,b[28]=46,b[29]=0,b[36]=55,那麼i=5循環結束後,由於a[0]=true,於是a[0+tt[5]]即a[8]=true,b[8]顯然由原來的0變為15,b[28]+w[5]=59>b[28+tt[5]]=55,於是b[36]變為59,而a[29]=false,b[29]=0,因而a[37]和b[37]保持不變。最後i=N循環結束後,b[1]到b[V]z中的最大者,即為所求。

若是體積不是整數,使精確到小數點後兩位的數,可以將物品體積和指定的V全部擴大100倍,化為整數問題來解決。

6樓程序里的判斷語句中的(j+tt[i]<=t) 一項可以去掉,但是數組a[]、b[]的范圍要重新設,因為最後j+tt[i]會達到所有N個物品的總體積。最後仍在b[1]到b[V]中去最大值,超過V的那些b[]不理。

7樓的方法則是要求價值p為正整數,外層循環仍然是物品編號,內層循環則是價值p從P到0,P為所有物品的總價值。

思路如下,從編號為1到k的物品中取出總價值不低於p的物品使得總體積最小,同樣分取和不取物品k兩種情形,取兩種情形中體積小者。

程序實現和6樓類似,只不過b[]換成f[p],表示從1到k中選取物品使價值之和恰好為p,所能達到的最小體積。外層最後一輪循環k=N結束後,從f[1]到f[P]中尋找小於V的那些f[p],其中最大的那個p極為所求。

取法記錄:C中可以用數組、結構、枚舉來記錄。比如對於6樓的方法,增設一個M[V][N]記錄取法。M[35][]={1,0,1,0,0,...0,1,0}表示取第1、3、N-1個物品,這三個物品的體積之和為35,上面舉例中b[8]和b[36]發生改變,於是M[8][]和M[36][]要相應改變,即M[8][5]和M[36][5]由0遍1,這里5代表第五個元素,不是按C的習慣代表第六個元素。

K指定的話方法其實是一樣的,分兩種情況討論。我最早學的BASIC,後來就是C,pascal泛泛瀏覽過,沒寫過pascal程序,現在是能讀不能寫。只好說明大致的思路如下:

value[1]到value[N],vol[1]到vol[N]為物品價值,體積,V為背包體積,K為要取的物品個數。

if L=0 or m<L then return 0 and return pickup=none //要取0個物品或是要取物品數大於剩餘物品數當然是只有什麼都不取了

if volume-vol[m]<0 then f(m,L,volume) = f(m-1,L,volume) return f and pickup //物品m體積大於剩餘空間,只有考慮不取物品m,從1到m-1中取L件的情況了,pickup不變

f(m,L,volume) = max { value[m]+f(m-1,L-1,volume-vol[m]) , f(m-1,L,volume)} //以上兩種情況都不成立的話,那麼就分兩種情況了,一是去m,從1到m-1中取L-1件,一是不取m,從1到m-1中取L件

return f and pickup //f(m-1,L,volume)大的話則pickup即為f(m-1,L,volume)返回的pickup,否則pickup為f(m-1,L-1,volume-vol[m])返回的pickup進行修改,把物品m標記為選取。

f(N.K,V)即為所求最大價值,返回的pickup為取法。

pascal程序應該是個function f()函數吧,主程序直接對value、vol、V等初始化,然後調用f(N,K,V)。由於函數進行了遞歸,在N增大時所要求的空間和時間會很大。如果用非遞歸的方法會稍好,可以用分支定界法剪枝,比如不取5,從1到4中選取的結果已經求出,而選取了5,不選4,現在從1到3中取,v不超過6.4,而前面算1到4時已經有了1到3,v不超過7.1的結果,這個結果加上5的價值都不如前面算的1到4的結果,更不用說v不超過6.4了,因此就不用繼續計算1到3,v不超過6.4的結果了。不過這樣將需要更多的變數保存中間結果,即搜索樹上的中間結點,程序也將復雜化。

上面所有的討論都沒有考慮有多解的情形,如果取1、2、6和取2、4都是總體積58,總價值97,且為最優解,則上面的所有方法都只能得到其中一組解,如果要得到所有解,需要對保存取法的變數進行改動,通常建立一個索引即可。M[1]到M[V]可以作為V個指向鏈表的指針,如果v=28有三組解,可以用num[28]=3保存或是保存在M[28]指向的鏈表的頭結點。上面所謂的a[m]為true或false也不用了,num[m]=0(此時M[m]指向null)或者M[m]指向的頭結點是個單結點。其實無需記錄解的數目,v=36的解變更時,自然會讀取v=28的解的鏈表,從頭讀到尾。

⑺ 如何正確使用資料庫索引

問題補充:能不能具體點,新建一個索引就可以了嗎
基本上可以這么說,不過你也可以修改索引。
記住:
索引其實關鍵目的是為了加快檢索速度而建立的,所以,怎麼用索引是資料庫系統本身的事情,作為資料庫設計或使用者,設計並創建好索引然後體驗加上索引後的查詢變快的感覺就行了。所以,索引怎麼用就變為了「怎麼創建合適的索引」
以下回答是否符合你的要求?你還有什麼問題?
第一次回答:
一、索引是什麼
索引是與表或視圖關聯的磁碟上結構,可以加快從表或視圖中檢索行的速度。索引包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構(B 樹)中,使 sql Server 可以快速有效地查找與鍵值關聯的行。
表或視圖可以包含以下類型的索引:
* 聚集
o 聚集索引根據數據行的鍵值在表或視圖中排序和存儲這些數據行。索引定義中包含聚集索引列。每個表只能有一個聚集索引,因為數據行本身只能按一個順序排序。
o 只有當表包含聚集索引時,表中的數據行才按排序順序存儲。如果表具有聚集索引,則該表稱為聚集表。如果表沒有聚集索引,則其數據行存儲在一個稱為堆的無序結構中。
* 非聚集
o 非聚集索引具有獨立於數據行的結構。非聚集索引包含非聚集索引鍵值,並且每個鍵值項都有指向包含該鍵值的數據行的指針。
o 從非聚集索引中的索引行指向數據行的指針稱為行定位器。行定位器的結構取決於數據頁是存儲在堆中還是聚集表中。對於堆,行定位器是指向行的指針。對於聚集表,行定位器是聚集索引鍵。
o 您可以向非聚集索引的葉級添加非鍵列以跳過現有的索引鍵限制(900 位元組和 16 鍵列),並執行完整范圍內的索引查詢。
聚集索引和非聚集索引都可以是唯一的。這意味著任何兩行都不能有相同的索引鍵值。另外,索引也可以不是唯一的,即多行可以共享同一鍵值。
每當修改了表數據後,都會自動維護表或視圖的索引。
索引和約束
對表列定義了 PRIMARY KEY 約束和 UNIQUE 約束時,會自動創建索引。例如,如果創建了表並將一個特定列標識為主鍵,則 資料庫引擎自動對該列創建 PRIMARY KEY 約束和索引。有關詳細信息,請參閱創建索引(資料庫引擎)。
二、索引有什麼用
與書中的索引一樣,資料庫中的索引使您可以快速找到表或索引視圖中的特定信息。索引包含從表或視圖中一個或多個列生成的鍵,以及映射到指定數據的存儲位置的指針。通過創建設計良好的索引以支持查詢,可以顯著提高資料庫查詢和應用程序的性能。索引可以減少為返回查詢結果集而必須讀取的數據量。索引還可以強製表中的行具有唯一性,從而確保表數據的數據完整性。
設計良好的索引可以減少磁碟 I/O 操作,並且消耗的系統資源也較少,從而可以提高查詢性能。對於包含 SELECT、UPDATE、DELETE 或 MERGE 語句的各種查詢,索引會很有用。例如,在 AdventureWorks 資料庫中執行的查詢 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。執行此查詢時,查詢優化器評估可用於檢索數據的每個方法,然後選擇最有效的方法。可能採用的方法包括掃描表和掃描一個或多個索引(如果有)。
掃描表時,查詢優化器讀取表中的所有行,並提取滿足查詢條件的行。掃描表會有許多磁碟 I/O 操作,並佔用大量資源。但是,如果查詢的結果集是占表中較高百分比的行,掃描表會是最為有效的方法。
查詢優化器使用索引時,搜索索引鍵列,查找到查詢所需行的存儲位置,然後從該位置提取匹配行。通常,搜索索引比搜索表要快很多,因為索引與表不同,一般每行包含的列非常少,且行遵循排序順序。
查詢優化器在執行查詢時通常會選擇最有效的方法。但如果沒有索引,則查詢優化器必須掃描表。您的任務是設計並創建最適合您的環境的索引,以便查詢優化器可以從多個有效的索引中選擇。SQL Server 提供的資料庫引擎優化顧問可以幫助分析資料庫環境並選擇適當的索引。
三、索引怎麼用
索引其實關鍵目的是為了加快檢索速度而建立的,所以,怎麼用索引是資料庫系統本身的事情,作為資料庫設計或使用者,設計並創建好索引然後體驗加上索引後的查詢變快的感覺就行了。所以,索引怎麼用就變為了「怎麼創建合適的索引」,以下說明這個問題:
索引設計不佳和缺少索引是提高資料庫和應用程序性能的主要障礙。設計高效的索引對於獲得良好的資料庫和應用程序性能極為重要。為資料庫及其工作負荷選擇正確的索引是一項需要在查詢速度與更新所需開銷之間取得平衡的復雜任務。如果索引較窄,或者說索引關鍵字中只有很少的幾列,則需要的磁碟空間和維護開銷都較少。而另一方面,寬索引可覆蓋更多的查詢。您可能需要試驗若干不同的設計,才能找到最有效的索引。可以添加、修改和刪除索引而不影響資料庫架構或應用程序設計。因此,應試驗多個不同的索引而無需猶豫。
SQL Server 中的查詢優化器可在大多數情況下可靠地選擇最高效的索引。總體索引設計策略應為查詢優化器提供可供選擇的多個索引,並依賴查詢優化器做出正確的決定。這在多種情況下可減少分析時間並獲得良好的性能。若要查看查詢優化器對特定查詢使用的索引,請在 SQL Server Management Studio 中的「查詢」菜單上選擇「包括實際的執行計劃」。
不要總是將索引的使用等同於良好的性能,或者將良好的性能等同於索引的高效使用。如果只要使用索引就能獲得最佳性能,那查詢優化器的工作就簡單了。但事實上,不正確的索引選擇並不能獲得最佳性能。因此,查詢優化器的任務是只在索引或索引組合能提高性能時才選擇它,而在索引檢索有礙性能時則避免使用它。
建議的索引設計策略包括以下任務:
1. 了解資料庫本身的特徵。例如,它是頻繁修改數據的聯機事務處理 (OLTP) 資料庫,還是主要包含只讀數據的決策支持系統 (DSS) 或數據倉庫 (OLAP) 資料庫?
2. 了解最常用的查詢的特徵。例如,了解到最常用的查詢聯接兩個或多個表將有助於決定要使用的最佳索引類型。
3. 了解查詢中使用的列的特徵。例如,某個索引對於含有整數數據類型同時還是唯一的或非空的列是理想索引。篩選索引適用於具有定義完善的數據子集的列。
4. 確定哪些索引選項可在創建或維護索引時提高性能。例如,對現有某個大型表創建聚集索引將會受益於 ONLINE 索引選項。ONLINE 選項允許在創建索引或重新生成索引時繼續對基礎數據執行並發活動。
5. 確定索引的最佳存儲位置。非聚集索引可以與基礎表存儲在同一個文件組中,也可以存儲在不同的文件組中。索引的存儲位置可通過提高磁碟 I/O 性能來提高查詢性能。例如,將非聚集索引存儲在表文件組所在磁碟以外的某個磁碟上的一個文件組中可以提高性能,因為可以同時讀取多個磁碟。
或者,聚集索引和非聚集索引也可以使用跨越多個文件組的分區方案。在維護整個集合的完整性時,使用分區可以快速而有效地訪問或管理數據子集,從而使大型表或索引更易於管理。有關詳細信息,請參閱已分區表和已分區索引。在考慮分區時,應確定是否應對齊索引,即,是按實質上與表相同的方式進行分區,還是單獨分區。
# 設計索引。
索引設計是一項關鍵任務。索引設計包括確定要使用的列,選擇索引類型(例如聚集或非聚集),選擇適當的索引選項,以及確定文件組或分區方案布置。
# 確定最佳的創建方法。按照以下方法創建索引:
* 使用 CREATE TABLE 或 ALTER TABLE 對列定義 PRIMARY KEY 或 UNIQUE 約束
SQL Server 資料庫引擎自動創建唯一索引來強制 PRIMARY KEY 或 UNIQUE 約束的唯一性要求。默認情況下,創建的唯一聚集索引可以強制 PRIMARY KEY 約束,除非表中已存在聚集索引或指定了唯一的非聚集索引。默認情況下,創建的唯一非聚集索引可以強制 UNIQUE 約束,除非已明確指定唯一的聚集索引且表中不存在聚集索引。
還可以指定索引選項和索引位置、文件組或分區方案。
創建為 PRIMARY KEY 或 UNIQUE 約束的一部分的索引將自動給定與約束名稱相同的名稱。
* 使用 CREATE INDEX 語句或 SQL Server Management Studio 對象資源管理器中的「新建索引」對話框創建獨立於約束的索引
必須指定索引的名稱、表以及應用該索引的列。還可以指定索引選項和索引位置、文件組或分區方案。默認情況下,如果未指定聚集或唯一選項,將創建非聚集的非唯一索引。若要創建篩選索引,請使用可選的 WHERE 子句。
# 創建索引。
要考慮的一個重要因素是對空表還是對包含數據的表創建索引。對空表創建索引在創建索引時不會對性能產生任何影響,而向表中添加數據時,會對性能產生影響。
對大型表創建索引時應仔細計劃,這樣才不會影響資料庫性能。對大型表創建索引的首選方法是先創建聚集索引,然後創建任何非聚集索引。在對現有表創建索引時,請考慮將 ONLINE 選項設置為 ON。該選項設置為 ON 時,將不持有長期表鎖以繼續對基礎表的查詢或更新。

⑻ 索引在mysql中怎麼存儲的

MySQL主要提供2種方式的索引:B-Tree(包括B+Tree)索引,Hash索引。
B-Tree的存儲方式是平衡二叉樹;
Hash索引的存儲方式是構建hash表。

⑼ mysql資料庫,索引是怎麼使用的

MySQL支持很多數據類型,選擇合適的數據類型存儲數據對性能有很大的影響。通常來說,可以遵循以下一些指導原則:
(1)越小的數據類型通常更好:越小的數據類型通常在磁碟、內存和CPU緩存中都需要更少的空間,處理起來更快。
(2)簡單的數據類型更好:整型數據比起字元,處理開銷更小,因為字元串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字元串來存儲時間;以及用整型數據類型存儲IP地址。
(3)盡量避免NULL:應該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。

⑽ 在數據表中索引有什麼用,怎麼建立索引

索引用於快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間就越多。建立索引的操作步驟如下:

1、首先我們打開一個要操作的數據表,如下圖所示,我們需要給name欄位添加索引。