MySQL理解索引 新增索引的原則

2021-08-07 15:46:51 字數 3595 閱讀 4967

**:mysql理解索引、新增索引的原則

索引用於快速找出在某個列中有一特定值的行。不使用索引,mysql必須從第1條記錄開始然後讀完整個表直到找出相關的行,還需要考慮每次讀入資料頁的io開銷。而如果採取索引,則可以根據索引指向的頁以及記錄在頁中的位置,迅速地讀取目標頁進而獲取目標記錄。

大多數情況下都(預設)採用b樹來構建索引。只是空間列型別的索引使用r-樹,並且memory表還支援hash索引。b樹是平衡多叉樹,每個節點存放多少個值取決於值所佔的空間,這與每一張資料頁存放多少條記錄與記錄資訊量有關同理。節點中的值是以非降序進行排列的,節點中的值總是小於等於指向它的結點中的值。

mysql使用b樹構造索引的情況下,是由葉子指向具體的頁和記錄的。並且乙個葉子有乙個指標指向下乙個葉子。

使用索引需要注意:

⑴只對where和order by需要查詢的字段設定索引,避免無意義的硬碟開銷;

⑵組合索引支援字首索引;

⑶更新表的時候,如增刪記錄,mysql會自動更新索引,保持樹的平衡;因此更多的索引意味著更多的維護成本

索引的字段型別問題

索引分四類:

index ----普通的索引,資料可以重複

fulltext----全文索引,用來對大表的文字域(char,varchar,text)進行索引。語法和普通索引一樣。 

unique ----唯一索引,唯一索引,要求所有記錄都唯一

primary key ----主鍵索引,也就是在唯一索引的基礎上相應的列必須為主鍵

like 不能用索引?

想象一下,你在看一本成語詞典,目錄是按成語拼音順序建立,查詢需求是,你想找以 「一」字開頭的成語(」一%「),和你想找包含一字的成語(「%一%」)

<,<=,=,>,>=,between,in

<>,not in ,!=則不行

原則

1,單錶資料太少,索引反而會影響速度;更新非常頻繁的資料不適宜建索引

2,where後的條件,order by ,group by 等這樣過濾時,後面的字段最好加上索引。根據實際情況,選擇primary key、unique、index等索引,但是不是越多越好,要適度

3,聯合查詢,子查詢等多表操作時關連欄位要加索引

ps:資料量特別大的時候,最好不要用聯合查詢,即使你做了索引

一次查詢只能用到乙個索引,所以 首先槍斃 a,b各建索引方案

a還是b? 誰的區分度更高(同值的最少),建誰!

當然,聯合索引也是個不錯的方案,ab,還是ba,則同上,區分度高者,在前

where a = 「***」 可以使用 ab 聯合索引

where b = 「***」 則不可 (再想象一下,這是書的目錄?)

所以,大多數情況下,有ab索引了,就可以不用在去建乙個a索引了

詳解:

聯合索引又叫復合索引。對於復合索引:mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支援a | a,b| a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 .當最左側欄位是常量引用時,索引就十分有效。

兩個或更多個列上的索引被稱作復合索引。

利用索引中的附加列,您可以縮小搜尋的範圍,但使用乙個具有兩列的索引 不同於使用兩個單獨的索引。復合索引的結構與**簿類似,人名由姓和名構成,**簿首先按姓氏對進行排序,然後按名字對有相同姓氏的人進行排序。如果您知 道姓,**簿將非常有用;如果您知道姓和名,**簿則更為有用,但如果您只知道名不姓,**簿將沒有用處。

所以說建立復合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜尋或僅對前幾列執行搜尋時,復合索引非常有用;僅對後面的任意列執行搜尋時,復合索引則沒有用處。

如:建立 姓名、年齡、性別的復合索引。

create table test(

a int,

b int,

c int,

key a(a,b,c)

);優: select * from test where a=10 and b>50

差: select * from test where a50

優: select * from test order by a

差: select * from test order by b

差: select * from test order by c

優: select * from test where a=10 order by a

優: select * from test where a=10 order by b

差: select * from test where a=10 order by c

優: select * from test where a>10 order by a

差: select * from test where a>10 order by b

差: select * from test where a>10 order by c

優: select * from test where a=10 and b=10 order by a

優: select * from test where a=10 and b=10 order by b

優: select * from test where a=10 and b=10 order by c

優: select * from test where a=10 and b=10 order by a

優: select * from test where a=10 and b>10 order by b

差: select * from test where a=10 and b>10 order by c

索引原則

1.索引越少越好

原因:主要在修改資料時,第個索引都要進行更新,降低寫速度。

2.最窄的字段放在鍵的左邊

3.避免file sort排序,臨時表和表掃瞄.

也即select * from test where mobile = 13711112222;

可是無法用到mobile欄位的索引的哦(如果mobile是char 或 varchar型別的話)

btw,千萬不要嘗試用int來存手機號(為什麼?自己想!要不自己試試)

索引包含了所需的全部值的話,就只select 他們,換言之,只select 需要用到的字段,如無必要,可盡量避免select *

null會導致索引形同虛設,所以在設計表結構時應避免null 的存在(用其他方式表達你想表達的null,比如 -1?)

show index from tablename;

explain select ……;

關於explain,改天可以找個時間專門寫一篇入門帖,在此之前,可以嘗試 google

過早優化,一直是個非常討厭而又時刻存在的問題,大多數時候就是因為不了解自己的系統,不知道自己系統真正的承載能力

比如:幾千條資料的新聞表,每天幾百幾千次的正文搜尋,大多數時候我們可以放心的去like,而不要又去建一套全文搜尋什麼的,畢竟cpu還是比人腦厲害太多

mysql索引新增 mysql 建立索引

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

mysql 字首索引 mysql索引做字首原則

索引做字首原則 多列字段組合索引下,索引的有效性是從左到右匹配 in 遇到範圍查詢停止 like,between,is null 索引左字首原則 1.按照索引建立的組合順序,從左往右生效 2.遇到 或in繼續,遇到範圍停止 3.排序字段支援索引左字首 建立索引原則 1.根據具體業務查詢邏輯,設定有效...

mysql 新增索引

mysql索引原理 1.新增primary key 主鍵索引 mysql alter table table name add primary key column 2.新增unique 唯一索引 mysql alter table table name add unique column 3.新增...