MYSQL用法 九 索引用法

2021-06-23 04:57:20 字數 4419 閱讀 6984

什麼是索引

索引時一種特殊的檔案,他們包涵著對資料表裡所有記錄的引用指標。

當對資料表記錄進行更新後,都會對索引進行重新整理。

索引會占用相當大的空間,應該只為經常查詢和最經常排序的資料列建立索引。

索引型別

①普通索引:這是最基本的索引型別,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立:

i.建立索引

例如:create index 《索引的名字》 on tablename (列的列表);

ii.修改表

例如:alter table tablename addindex [索引的名字] (列的列表);

iii.建立表的時候指定索引

例如:create table tablename ( [...],index [索引的名字] (列的列表) );

②唯一性索引

這種索引和前面的「普通索引」基本相同,但有乙個區別:索引列的所有值都只能出現一次,即必須唯一。

建立方式:和普通索引建立方式一樣,將「index」替換成「unique」就可以了

③主鍵索引

主鍵是一種唯一性索引,但它必須指定為「primary key」。每個表只能有乙個主鍵

④全文索引

文字欄位上的普通索引只能加快對出現在字段內容最前面的字串進行的檢索操作。如果欄位裡存放的是由學多個單詞構成的大段文字,普通索引就沒什麼作用「%word%」費時,效率低,響應時間長。

生成全文索引時,mysql將把文中出現的所有單詞建立乙份清單,查詢操作根據這份清單去檢索相關資料記錄。

但目前全文索引對中文支援很差,需要相關分詞外掛程式。(如:

多重索引

索引可以是單列索引,也可以是多列索引。

建立多列索引:altertable people add index fname_lname_age (firstname,lastname,age);

由於索引檔案以b-樹格式儲存,mysql能夠立即轉到合適的firstname,然後再轉到合適的lastname,最後轉到合適的age。mysql只需一次檢索就能夠找出正確的結果!在沒有掃瞄資料檔案任何乙個記錄的情況下,mysql就正確地找出了搜尋的目標記錄! 

多重索引還有另外乙個優點,它通過稱為最左字首(leftmost prefixing)的概念體現出來。

假若現在我們有乙個firstname、lastname、age列上的多重索引,我們稱這個索引為fname_lname_age。當搜尋條件是以下各種列的組合時,mysql將使用fname_lname_age索引:

firstname,lastname,age

firstname,lastname

firstname

選擇索引列

在效能優化過程中,選擇在哪些列上建立索引是最重要的步驟之一。可以考慮使用索引的主要有兩種型別的列:

在where子句中出現的列

在join子句中出現的列

例子:select people.age, ##不使用索引

town.name ##不使用索引

from people left join town on

people.townid=town.townid ##考慮使用索引

where firstname='mike'##考慮使用索引

and lastname='sullivan'##考慮使用索引

那麼,我們是否可以簡單地認為應該索引where子句和join子句中出現的每乙個列呢?

差不多如此,但並不完全。我們還必須考慮到對列進行比較的操作符型別。mysql只有對以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的like。可以在like操作中使用索引的情形是指另乙個運算元不是以萬用字元(%或者_)開頭的情形。

分析索引效率

explain

例子: explain select peopleid frompeople where firstname='mike'and lastname='sullivan' and age='17';

這個命令將返回下面這種分析結果:

------------------------

table  type  possible_keys    key              key_len  ref                rows  extra

people ref   fname_lname_age  fname_lname_age  102      const,const,const  1     where used

------------------------

table:這是表的名字。

type:連線操作的型別。下面是mysql文件關於ref連線型別的說明:

對於每一種與另乙個表中記錄的組合,mysql將從當前的表讀取所有帶有匹配索引值的記錄。如果連線操作只使用鍵的最左字首,或者如果鍵不是unique或primary key型別(換句話說,如果連線操作不能根據鍵值選擇出唯一行),則mysql使用ref連線型別。如果連線操作所用的鍵只匹配少量的記錄,則ref是一種好的連線型別。」

在本例中,由於索引不是unique型別,ref是我們能夠得到的最好連線型別。

如果explain顯示連線型別是「all」,而且你並不想從表裡面選擇出大多數記錄,那麼mysql的操作效率將非常低,因為它要掃瞄整個表。你可以加入更多的索引來解決這個問題。預知更多資訊,請參見mysql的手冊說明。 

possible_keys:可能可以利用的索引的名字。這裡的索引名字是建立索引時指定的索引暱稱;如果索引沒有暱稱,則預設顯示的是索引中第乙個列的名字(在本例中,它是「firstname」)。預設索引名字的含義往往不是很明顯。

key: 它顯示了mysql實際使用的索引的名字。如果它為空(或null),則mysql不使用索引。

key_len: 索引中被使用部分的長度,以位元組計。在本例中,key_len是102,其中firstname佔50位元組,lastname佔50位元組,age佔2位元組。如果mysql只使用索引中的firstname部分,則key_len將是50。

ref: 它顯示的是列的名字(或單詞「const」),mysql將根據這些列來選擇行。在本例中,mysql根據三個常量選擇行。

rows: mysql所認為的它在找到正確的結果之前必須掃瞄的記錄數。顯然,這裡最理想的數字就是1。

extra: 這裡可能出現許多不同的選項,其中大多數將對查詢產生負面影響。在本例中,mysql只是提醒我們它將用where子句限制搜尋結果集。

索引設計

一般針對資料分散的關鍵字進行建立索引,比如id、login_id,user_id,等建立索引沒有意義

盡量使用短索引,一般對int、char/varchar、date/time 等型別的字段建立索引

需要的時候建立聯合索引,但是要注意查詢sql語句的編寫謹慎建立 unique 型別的索引(唯一索引)

一般建議每條記錄最好有乙個能快速定位的獨一無二定位的唯一標示(索引)

不要過度索引,單錶建立的索引不要超過5個,否則更新索引將很耗時

能夠快速縮小結果集的 where 條件寫在前面,如果有恒量條件,也盡量放在前面

盡量避免使用 group by、distinct、or、in等語句的使用,避免使用聯表查詢和子查詢,因為將使執行效率大大下降能夠使用索引的字段盡量進行有效的合理排列,如果使用了聯合索引,請注意提取欄位的前後順序

如果where子句的查詢條件裡有不等號(wherecolumns !=…),mysql將無法使用索引

類似地,在sql裡使用了mysql部分自帶函式,索引將失效,同時將無法使用 mysql的 querycache,比如 left(),substr(), to_days()date_format(), 等,如果使用了 or 或 in,索引也將失效

在join操作中,mysql只有在主鍵和外來鍵的資料型別相同時才能使用索引

針對索引字段使用 >, >=, =, <, <=, if null和between 將會使用索引,  如果對某個索引字段進行 like 查詢和regexp,mysql只有在搜尋模板的第乙個字元不是萬用字元的情況下才能使用索引。比如說,使用 like  『%abc%』不能使用索引,使用 like 『abc%』 將能夠使用索引

在orderby操作中,mysql只有在排序條件不是乙個查詢條件表示式的情況下才使用索引

MySQL索引用法例項分析

mysql描述 乙個文章庫,裡面有兩個表 category和art程式設計客棧icle。category裡面有10條分類資料。article裡面有20萬條。article裡面有乙個 article category 欄位是與category裡的 category id 字段相對應的。article表...

python索引用法 Python切片索引用法

這篇文章主要介紹了python切片索引用法,結合例項形式詳細分析了python切片索引的常見使用方法與操作注意事項,需要的朋友可以參考下 在python中,可以用用簡單的方括號加乙個下標的方式訪問序列的每乙個元素,這種方式稱之為切片操作符,切片操作符有三種形式 訪問某一資料元素的語法如下 seque...

Mysql索引的用法

1.索引的分類 在mysql中索引可以分為三類 主鍵索引 設定為主鍵的列會建立主鍵索引,主鍵唯一非空。單列索引 即索引中只包含乙個列,一張表可以有多個單列索引 唯一索引 索引列的值必須唯一,允許有空值 4 復合索引 即索引中可以包含多個列 2.建立索引 可以在建立表的同時建立索引,也可以在已有表的基...