MySQL索引的個人總結

2021-10-12 14:39:54 字數 2733 閱讀 5188

索引相當於一本圖書的目錄,能夠快速地讓你查詢到書中你想看的內容。mysql官方文件對索引的定義為:

索引(index)是幫助mysql高效獲取資料的資料結構。

我們可以簡單理解為:快速查詢排好序的一種資料結構。

官方文件也提及在500~800w記錄左右mysql的效能,所以大資料量建立索引是非常有必要的。

優點:

索引大大減小了伺服器需要掃瞄的資料量;

索引可以幫助伺服器避免排序和臨時表;

索引可以將隨機io變成順序io;

索引對於innodb儲存引擎(對索引支援行級鎖)非常重要,因為它可以讓查詢鎖更少的元組。

缺點:

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

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

如果某個資料列包含許多重複的內容,為它建立索引就沒有太大的實際效果;

對於非常小的表,大部分情況下簡單的全表掃瞄更高效。

索引的型別一共有四種,b+樹索引、hash索引、全文索引和r樹索引。

常用的是b+樹索引和hash索引。

hash索引查詢單條資料的時候快,但是範圍查詢慢。

b+樹則十分適和範圍查詢,innodb儲存引擎索引預設使用的就是b+樹。

mysql是用磁碟io次數衡量查詢效率的。一般來說索引非常大,尤其是關係性資料庫這種資料量大的索引能達到億級別,所以為了減少記憶體的占用,索引也會被儲存在磁碟上。b-樹/b+樹 的特點就是每層節點數目非常多,層數很少,目的就是為了減少磁碟io次數,但是b-樹的每個節點都有data域(指標),這無疑增大了節點大小,說白了增加了磁碟io次數(磁碟io一次讀出的資料量大小是固定的,單個資料變大,每次讀出的就少,io次數增多,一次io多耗時),而b+樹除了葉子節點其它節點並不儲存資料,節點小,磁碟io次數就少。

聯合索引

全文索引fulltext :用於搜尋很長一篇文章的時候,效果最好。

空間索引spatial :沒接觸過

索引越多越好?

大多數情況下索引能大幅度提高查詢效率,但是資料的變更(增刪改)都需要維護索引(更新表時,mysql不僅要儲存資料,還要儲存索引檔案),因此更多的索引意味著更多的維護成本,更多的索引意味著也需要更多的空間。

索引的字段型別問題

text型別,也可建索引(需指定長度)

myisam儲存引擎索引鍵長度綜合不能超過1000位元組

用來篩選的值盡量保持和索引列同樣的資料型別

like 不能用索引?

儘量減少like,但不是絕對不可用,「***x%」 是可以用到索引的,但是」%***」則不可以.

除了like,以下操作符也可用到索引:

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

<>,not in ,!=則不行

什麼樣的字段不適合建索引?

一般來說,列的值唯一性太小(如性別,型別什麼的),不適合建索引(怎樣叫太小?一半說來,同值的資料超過表的百分之15,那就沒必要建索引了)。

太長的列,可以選擇只建立部分索引,(如:只取前十位做索引)

更新非常頻繁的資料不適宜建索引

一次查詢能用多個索引嗎?

不能。多列查詢該如何建索引?

這裡涉及兩個知識點:最左字首left-prefix,列基數cardinality

①按索引的最左邊字首(leftmost prefix of the index)來進行查詢:

1)查詢必須從索引的最左邊的列開始,否則無法使用索引。例如,你不能直接利用索引查詢在某一天出生的人。

2)不能跳過某一索引列。例如,你不能利用索引查詢last name為smith且出生於某一天的人。

3)儲存引擎不能使用索引中範圍條件右邊的列。例如,如果你的查詢語句為where last_name=「smith」 and first_name like 『j%』 and dob=『1976-12-23』,則該查詢只會使用索引中的前兩列,因為like是範圍查詢。

②列基數,是指它所容納的所有非重複值的個數,可以理解為 distinct(某列)後的結果

比如某個列包含值1,3,7,4,7,3,那麼它的基數就是4了

列基數越大,重複值越少,需要建索引,因為如果某列的值都是重複的就沒必要建索引了。

多列查詢該如何建索引

一次查詢只能用到乙個索引,這裡要考慮最左邊字首,所以不建議 a,b各列建索引方案。那麼a還是b? 誰的區分度更高(同值的最少)就建哪個。當然,聯合索引也是個不錯的方案,ab,還是ba。

哪些常見情況不能用索引?

like 「%***」

not in , !=

覆蓋索引(covering indexes)擁有更高效率

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

null 的問題

null會導致索引形同虛設,所以在設計表結構時應避免null 的存在

合理使用索引能大大加快mysql資料庫的查詢速度,但同時也要注意索引使用的場景和方法。

mysql系列:深入理解mysql 索引特性(屢試不爽的mysql索引總結)

mysql索引總結

mysql索引必須了解的幾個重要問題

在乙個千萬級的資料庫查尋中,如何提高查詢效率?

第一次寫部落格,有什麼不足之處請指出。

mysql索引問題個人總結

mysql是乙個很流行的資料庫,大中小公司都有使用,本人也使用了兩年mysql,對效能優化這塊很有興趣,尤其是索引,一直是一種模稜兩可的感覺,主要是總結的太少,學的很瑣碎,故寫此文來對自己做個總結。大多數索引 不包括hash 說白了就是顆樹,設定好索引等於建立了一顆包含索引列的樹,隨後可以根據樹的性...

mysql 索引總結 mysql索引總結

mysql中每乙個表都有乙個聚簇索引clusted index,該所索引是預設建立的,除此之外的表上的每乙個非聚簇索引都是二級索引,又叫輔助索引 secondary indexes 以innodb來說,每個innodb表具有乙個特殊的索引稱為聚集索引,如果您的表上定義有主鍵,該主鍵索引是聚集索引,如...

MySQL個人總結

php mysql開發的 注入時主要針對information schema這個資料庫進行的 它是你用php mysql開發 自動形成的資料庫 裡面存了很多資訊 schemata 存了所有資料庫的名字 tables 所有表的名字 columns 欄位的名字 以下是該資料庫的所有表 tables in...