高效能mysql 第五章索引(3)

2021-08-08 04:41:49 字數 1603 閱讀 4289

myisam使用字首壓縮來減少索引的大小,預設只壓縮字串,但是通過設定也可以對整數做壓縮。

壓縮可以使用更少的空間,代價是某些操作可能更慢。特別是倒序的查詢,測試表明,對於cpu密集型的應用,查詢會很慢,特別是倒序。對於i/o密集型應用,查詢可能會不錯。

可以在create table的語句中指定pack_keys引數來指定索引壓縮方式。

重複索引:指在相同的列上按照相同的順序建立的相同型別的索引,要盡量避免重複索引,除非在同一列上建立不同型別的索引來滿足不同的查詢需求。比方說 key(col) 和 fulltext key(col)。

冗餘索引:如果建立了索引(a,b),再建立索引(a)就是冗餘索引。因為索引(a,b)也可以當作(a)來使用(只針對b-tree)。但是如果再建立索引(b,a)或者(b),則不是冗餘索引。或者型別不同,比方說雜湊,全文索引等。

冗餘索引通常發生在新增索引的時候,大多數情況下都不需要冗餘索引,而是盡量擴充套件已有的索引,除非擴充套件已有的索引會導致索引很大,從而影響其他使用索引的效能。

例如:在乙個整數列的索引上擴充套件乙個很長的varchar列的索引,效能可能就會急劇下降。但是增加乙個新的索引,就會對增刪改操作影響很大,所以要平衡使用。

如何找到這寫索引,以便刪除,可以訪問information_schema,或者一些現有的工具來定位。

有乙個值得注意的地方:

對於innodb因為二級索引包換了主鍵,所以列(a)上的索引就相當與(a,id),所以類似

where a=5 order by id 這樣的查詢,這個索引會很有用。但是擴充套件為索引(a,b)

之後,則實際變成了(a,b,id),則order by就無法用到索引排序了。

索引可以讓查詢鎖定更少的行,因為索引可以讓查詢不訪問那些不需要的行,那麼就會鎖定更少的行。這有2點好處:

1、減少鎖定行帶來的額外的開銷。

2、鎖定超過需要的行會增加鎖爭用和減少併發性。

innodb只有在訪問行的時候才會對其加鎖,而索引能減少innodb訪問的行數,從而減少鎖的數量。但這只有當innodb在儲存引擎層能夠過濾掉所有不需要的行時才有效。如果索引無法過濾掉無效的行,那麼在innodb檢索到資料返回給伺服器層以後,mysql伺服器才能應用where子句進行過濾。這時候已經無法避免鎖定行了,innodb已經鎖定了所有返回的資料行。

innodb在二級索引上使用共享讀鎖,在主鍵索引需要排它鎖

等以後再詳細看鎖的東西。

建立索引案例裡學到的:

- 如果建立聯合索引, (a, b, c) 為了以ac為條件進行查詢時可以使用到索引,可以在b上給他預設值。使他可以使用到索引。

- 避免多個範圍查詢。寧可使用 in() ,多個範圍條件查詢,mysql無法使用範圍列後面的其他索引。但是in()可以

- 優化排序(可以使用延遲關聯,首先使用到覆蓋索引查詢出主鍵id,然後再查詢id對應的資料)

- select

from profiles inner

join (

- select id from profiles where x.***='m'

order

by rating limit 1000,10

- )as x using id

高效能MySQL 第五章建立高效能的索引(2)

高效能的索引策略 一 獨立的列 如果查詢中的列不是獨立的,則mysql就不會使用索引。獨立的列 是指索引列不能是表示式的一部分,也不能是函式的函式。二 字首索引和索引選擇性 索引部分字元會降低索引的選擇性,索引的選擇性是指,不重複的索引值 也稱為基數,cardinality 和資料表的記錄總數 t ...

高效能MySQL 第五章建立高效能的索引(1)

在mysql中,儲存引擎使用索引,其先在索引中找到對應值,然後根據匹配的索引記錄找到對應的資料行。索引可以包含乙個或多個列的值。一 索引的型別 在mysql中,索引是在儲存引擎層而不是伺服器層實現的。mysql支援的索引型別 b tree索引 innodb使用的是b tree。b tree通常意味著...

索引的底層實現 高效能Mysql(第五章筆記2)

b 樹索引的使用 我們日常使用中,索引可以引用了很多列,而不是單一列的索引。1 如果不是按照索引的最左列開始查詢,則無法使用索引。2 不能跳過索引中的列,否則生效的只能是索引左側沒跳過的列。3 如果查詢中有某個列是範圍查詢,則其右邊的列都無法使用索引優化查詢。上面三條意味著,索引中列的順序,至關重要...