mysql中的索引

2021-07-25 03:54:17 字數 2047 閱讀 9374

mysql中的索引

什麼是索引?

索引是對資料庫中某乙個表的資料進行排序,這種排序並不是真正的對錶中資料按照大小排序,

而是另外再建立乙個索引檔案來存放包含btree資料結構,在資料結構中根據索引欄位的值排序,資料結構的值包括:

索引欄位的值和索引對應資料行的位址。索引查詢就是先查詢這個索引檔案來獲得資料表中目的行的位址,然後直接根據位址去表中鎖定行即可。

舉乙個例子,如乙個user表中有100萬行無序資料,現在查詢「name=張三」的資料

不使用索引排序的話,就必須一行行的去查詢比較name欄位是否等於張三。執行量為n/2=50萬

而如果使用了索引且索引欄位是name,那麼就會先去索引檔案(有序)中,折半查詢索引值為張三的資料行,從而獲得

指向user表中滿足name=張三的行的位址,通過位址直接從user表中取出查詢的行。這樣執行量為log2(n)=20

結果很驚人吧!不使用索引平均查詢量是50萬次,而使用索引的平均次數是20次。

可見使用索引是有巨大好處的。

在mysql中有三種索引:普通索引,唯一索引,全文索引。索引可以是乙個欄位或著多個字段組成。

1.主鍵

主鍵是特殊的唯一索引,但與唯一索引的區別就是,乙個表中只能有乙個主鍵,但是可以有多個

唯一索引。

2.復合索引

復合索引或者叫聯合索引,復合索引就是索引用多個字段組成。一般用於需要經常對錶中的多個欄位做匹配查詢的情況。

使用復合索引查詢時必須按照的復合索引定義時的順序從左到右寫。必須滿足「最右原則」

比如:定義乙個普通索引 index u_index(a,b,c) 那麼在查詢時使用時,只能是 a 或a,b或a,b,c三種形式,不能出現b,c或者c,b,a等情況。這既是最左原則。

復合索引的結構與**簿類似,人名由姓和名構成,**簿首先按姓氏對進行排序,然後按名字對有相同姓氏的人進行排序。如果您知 道姓,**簿將非常有用;如果您知道姓和名,**簿則更為有用,但如果您只知道名不姓,**簿將沒有用處。所以說建立復合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜尋或僅對前幾列執行搜尋時,復合索引非常有用。僅對後面的任意列執行搜尋時,復合索引則沒有用處。

3.索引和唯一性檢查對資料插入,更新,刪除的影響

很顯然索引可以在很大程度上加快查詢速度,但是在插入資料時,卻會很大程度上減緩資料的

插入,更新,刪除操作,拿插入操作來說:有索引的情況下

在插入資料前,需要對索引檔案進行寫操作(索引檔案是樹的資料結構)。這一操作無疑降低了插入速度。如果插入的資料中有約束條件為唯一(unique)時,

插入前需要進行唯一性檢查,這也會降低資料的插入速度。

針對這索引和唯一性檢查會降低插入速度的問題,可以這樣解決,在插入資料之前,關閉索引或者刪除索引和關閉唯一性檢查,插入資料後再開啟或建立。

禁用索引  alter table 表名 disable keys;

開啟索引  alter table 表名 enable  keys;

刪除索引  drop index 索引別名 on table_name;

建立索引  create [unique|fulltext|spatial]  index|key  索引別名 on table_name(屬性(m) asc|desc);

禁止唯一性檢查 set unique_checks=0;

開啟唯一性檢查 set unique_checks=1;

4.索引失效

(1)索引支援支援 =  > < like 等操作符,但是不支援 !=  in not in等。

(2)使用or兩側必須都是索引 如: select * from user where id=1 or name='張三'; 那麼id和name都必須是索引。

(3)使用like進行模糊查詢時,不能以%開頭。如: select * from user where name like '%三'; 但是'張%'是有效的。

(4)索引欄位是字串型,在查詢的條件中一定要用引號括起來。

(5)多個字段組成的復合索引必須準守最左原則。

(6)如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引

(7)在索引欄位上使用了mysql函式

MySQL索引,MySQL中索引的限制?

mysql中索引的限制 1 myisam儲存引擎引鍵的長度綜合不能超過1000位元組 2 blob和text型別的列只能建立字首索引 3 mysql目前不支援函式索引 4 使用!或者 的時候mysql不能使用索引 5 過濾字段使用了函式運算的時候如 abs key sum key 的時候mysql無...

MySql中的索引

索引就是資料庫內部對某個表的所有資料預先進行的某種排序,以便於後面的快速查詢。作用 可以極大的加快資料的查詢速度 通常所謂的建立索引,就是指定乙個表的某個或某些字段作為 索引資料字段 就可以了,形式為 索引型別 要建立的索引的欄位名 create table if notexists 表名 欄位1,...

MySQL中的索引

mysql 中的索引 日期 2010 06 04 引言 如圖書館等存放大量資料的場合都需要設定索引以方便檢索。當資料庫中儲存的記錄逐漸海量化的時候,合理地採用索引能大大改善程式效能。使用索引 首先,建立乙個用於測試的表 create table test books id int not null ...