mysql建立索引

2021-07-05 10:40:04 字數 4860 閱讀 4278

alter table message_text add index(from_id);

alter table message_text add index(to_id);

create index 語句用於在表中建立索引。

在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。

sql create index 語法

在表上建立乙個簡單的索引。允許使用重複的值:

create index index_name

on table_name (column_name)

注釋:」column_name」 規定需要索引的列。

create index 例項

本例會建立乙個簡單的索引,名為 「personindex」,在 person 表的 lastname 列:

create index personindex

on person (lastname)

sql create unique index 語法

在表上建立乙個唯一的索引。唯一的索引意味著兩個行不能擁有相同的索引值。

create unique index index_name

on table_name (column_name)

如果您希望以降序索引某個列中的值,您可以在列名稱之後新增保留字 desc:

create index personindex

on person (lastname desc)

假如您希望索引不止乙個列,您可以在括號中列出這些列的名稱,用逗號隔開:

create index personindex

on person (lastname, firstname)

假如我們建立了乙個 testindex 表:

create table testindex(i_testid int not null,vc_namevarchar(16) not null);

我們隨機向裡面插入了 1000 條記錄,其中有一條i_testid vc_name 555 erquan

在查詢 vc_name=」erquan」 的記錄 select * from testindex where vc_name=』erquan』; 時,如果在vc_name 上已經建立了索引,mysql 無須任何掃瞄,即準確可找到該記錄!相反,mysql 會掃瞄所有記錄,即要查詢 1000。以索引將查詢速度提高 100 倍。

一、索引分單列索引和組合索引

單列索引:即乙個索引只包含單個列,乙個表可以有多個單列索引,但這不是組合索引。組合索引:即乙個索包含多個列。

二、介紹一下索引的型別

1、普通索引。

這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

(1)建立索引:create index indexnameon tablename(tablecolumns(length));如果是char,varchar型別,length可以小於字段實際長度;如果是 blob 和 text 型別,必須指定 length,下同。

(2)修改表結構:alter tablename addindex [indexname] on (tablecolumns(length))

(3)建立表的時候直接指定:create tabletablename ( […], index [indexname] (tablecolumns(length)) ;

2、唯一索引。

它與前面的」普通索引」類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:

(1)建立索引:create unique indexindexname on tablename(tablecolumns(length))

(2)修改表結構:alter tablename addunique [indexname] on (tablecolumns(length))

(3)建立表的時候直接指定:create tabletablename ( […], unique [indexname] (tablecolumns(length));

3、主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引:create tabletestindex(i_testid int not null auto_increment,vc_name varchar(16) notnull,primary key(i_testid));當然也可以用 alter 命令。記住:乙個表只能有乙個主鍵。

4、全文索引

mysql 從 3.23.23 版開始支援全文索引和全文檢索。

刪除索引的語法:drop index index_name on tablename

三、單列索引和組合索引

為了形象地對比兩者,再建乙個表:

create table myindex ( i_testid int not nullauto_increment, vc_name varchar(50) not null, vc_city varchar(50) not null,i_age int not null, i_schoolid int not null, primary key (i_testid) );

在這 10000 條記錄裡面 7 上 8 下地分布了 5 條vc_name=」erquan」 的記錄,只不過 city,age,school 的組合各不相同。

來看這條 t-sql:select i_testid frommyindex where vc_name=』erquan』 and vc_city=』鄭州』 andi_age=25;

首先考慮建單列索引:

在 vc_name 列上建立了索引。執行 t-sql 時,mysql 很快將目標鎖定在了 vc_name=erquan 的 5 條記錄上,取出來放到一中間結果集。在這個結果集裡,先排除掉 vc_city 不等於」鄭州」的記錄,再排除 i_age 不等於 25 的記錄,最後篩選出唯一的符合條件的記錄。

雖然在 vc_name 上建立了索引,查詢時mysql不用掃瞄整張表,效率有所提高,但離我們的要求還有一定的距離。同樣的,在 vc_city 和 i_age 分別建立的單列索引的效率相似。

為了進一步榨取 mysql 的效率,就要考慮建立組合索引。就是將 vc_name,vc_city,i_age 建到乙個索引裡:

alter table myindex add index name_city_age(vc_name(10),vc_city,i_age);

建表時,vc_name 長度為 50,這裡為什麼用 10 呢?因為一般情況下名字的長度不會超過 10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高 insert 的更新速度。

執行 t-sql 時,mysql 無須掃瞄任何記錄就到找到唯一的記錄!!

肯定有人要問了,如果分別在 vc_name,vc_city,i_age上建立單列索引,讓該錶有 3 個單列索引,查詢時和上述的組合索引效率一樣嗎?大不一樣,遠遠低於我們的組合索引。雖然此時有了三個索引,但 mysql 只能用到其中的那個它認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立了

vc_name,vc_city,i_age

vc_name,vc_city

vc_name

這樣的三個組合索引!為什麼沒有 vc_city,i_age 等這樣的組合索引呢?這是因為 mysql 組合索引「最左字首」的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個 t-sql 會用到:

select * from myindex whree vc_name=」erquan」and vc_city=」鄭州」

select * from myindex whreevc_name=」erquan」

而下面幾個則不會用到:

select * from myindex whree i_age=20 and vc_city=」鄭州」

select * from myindex whree vc_city=」鄭州」

四、使用索引

到此你應該會建立、使用索引了吧?但什麼情況下需要建立索引呢?一般來說,在 where和 join 中出現的列需要建立索引,但也不完全如此,因為 mysql 只對 <,<=,=,>,>=,between,in,以及某些時候的like(後面有說明)才會使用索引。

select t.vc_name from testindex t left join myindex mon t.vc_name=m.vc_name where m.i_age=20 and m.vc_city=』鄭州』 時,有對 myindex 表的vc_city 和 i_age 建立索引的需要,由於testindex表的 vc_name 開出現在了 join 子句中,也有對它建立索引的必要。

剛才提到了,只有某些時候的 like 才需建立索引?是的。因為在以萬用字元 % 和 _ 開頭作查詢時,mysql 不會使用索引,如 select * from myindex where vc_name like』erquan%』

會使用索引,而 select * from myindex wheret vc_namelike』%erquan』 就不會使用索引了。

五、索引的不足之處

上面說了那麼多索引的好話,它真的有像傳說中那麼優秀麼?當然會有缺點了。

1、雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行 insert、update 和delete。因為更新表時,mysql 不僅要儲存資料,還要儲存一下索引檔案。

2、建立索引會占用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在乙個大表上建立了多種組合索引,索引檔案的會膨脹很快。

講了這麼多,無非是想利用索引提高資料庫的執行效率。不過索引只是提高效率的乙個因素。如果你的mysql有大資料的表,就需要花時間研究建立最優秀的索引或優化查詢語句。

(索引)建立MySQL索引

建立索引的必要性 主鍵預設是建立索引的,而且具有唯一性 合適地建立索引後比不建立索引,提高了查詢速度 建立索引的語法 簡單索引 可以有重複資料 create index indexname on tablename column name 1舉例子說明如 建立乙個資料表,設定一些初始的資料,然後採用...

c mysql建立索引 MySQL 建立索引

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

mysql索引新增 mysql 建立索引

mysql 索引 內容主要摘抄自 mysql5.7從入門到精通 索引是對資料庫表中的一列或多列進行排序的一種資料結構,使用索引可以提高資料庫中特定資料的查詢速度。一 索引含義和特點 索引是乙個單獨的 儲存在磁碟上的資料庫結構,它們包含著對資料表裡所有記錄的引用指標。mysql 中索引儲存型別有兩種 ...