VARCHAR列上的索引

2021-09-22 06:40:49 字數 1248 閱讀 7519

假設現在你想捉弄下sql server,在varchar(8000)的列上建立乙個索引,並在索引鍵列上插入超900byte的值。想想,sql server會如何反應?不知道?我們來試驗下。在下列**裡,我建立了有varchar(8000)列的表,並在這列上建立非聚集索引。

use

tempdb

go--

create a ****** table

create

table

foo(

bar

varchar(8000))

go--

create a ****** non-clustered index

create

nonclustered

index idx_bar on

foo(bar)

go

sql server這裡已給你乙個插入/更新操作會失敗的警告:

現在糟糕的事情發生了:我插入一條901byte大小列的記錄。

--

insert a too large index key column...

insert

into foo values(replicate('

x', 901

))go

偶滴神——如你所見,現在插入不會發生:

sql server還是會確保我們的鍵大小在900bytes限制內。我們來插入剛好900bytes鍵大小的記錄。

--

this will work

insert

into foo values(replicate('

x', 900

))go

現在這個會正常執行,沒有問題。但如果我們再次更新那列,讓它大於900bytes,會發生什麼?

--

this update will fail

update foo set bar =

replicate('

x', 901

)go

update語句也會失敗!這是對的。sql server再次保證鍵大小還是在它限制裡。啥收穫?不管你怎麼折騰,你不會打破sql server。

VARCHAR列上的索引

一年前,我寫了在索引的導航結構裡,sql server如何儲存varchar列。我們都知道,在sql server裡索引 聚集索引,非聚集索引 的鍵列有最大900byte的大小限制。假設現在你想捉弄下sql server,在varchar 8000 的列上建立乙個索引,並在索引鍵列上插入超900by...

bigInt與varchar索引的大小

今天晚上突然想到乙個問題 對於單個欄位的索引,用bigint和varchar做索引,bigint索引到底能減少多大?於是我建了兩張表 create table test long id bigint 20 not null,key in id engine innodb default charse...

VARCHAR欄位指定索引長度

在varchar欄位上建立索引時,必須指定索引長度,沒必要對全欄位建立索引,根據實際文字區分度決定索引長度 阿里開發手冊 create table my user id bigint unsigned user name varchar 50 primary key id insert into m...