MySQL資料高效能索引

2021-08-15 16:36:31 字數 2496 閱讀 8306

索引:類似資料的目錄,mysql儲存引擎使用類似方式進行查詢,先去索引找到對應的值,然後根據匹配的索引找到對應的資料行

索引對效能的影響:大大減少伺服器需要掃瞄的資料量。比如我們資料表1000條資料。我們只需要根據條件查詢其中的一條,我們針對這一列建立乙個索引,我們只需要掃瞄著一條就可以了。如果不建立索引我們需要掃瞄1000條,挨個去看,然後才能找到我們這條資料。

幫助伺服器避免排序和臨時表勝場。

將隨機io變成順序io

大大提公升我們的查詢速度

不良影響:降低寫的速度(對資料的新增也好,更新也好,刪除也),占用磁碟

索引的使用場景:

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

這種情況不建立索引效率更高,你想想我們就這50條資料,我們要掃40條或者要拿50條,我們不用看索引,直接拿出來就可以了。因為我們的mysql資料掃瞄非常快。

中到大型表,索引非常重要:大多數表都是中大型表,所以要建立額外的索引

特大型的表:比如上千萬條資料,建立和使用索引的代價隨之增長,可以使用分割槽技術來解決即可。

索引型別:mysql有很多索引型別,都是實現在儲存引擎層的

1. 普通索引:最基本的索引,沒有任何約束限制

2.      唯一索引:與普通索引類似,但是具有唯一約束

3.      主鍵索引:特殊的唯一索引,不允許為空

唯一索引和主鍵索引的區別:乙個表只能有乙個主鍵索引,可以多個唯一索引

主鍵索引一定是唯一索引,但是反之則不是

主鍵可以與外來鍵構成參照完整性約束,防止資料不一致

4.組和索引:將多個列組合在一起建立索引,可以覆蓋多個列

必須說我們現在這當中查詢查詢我們這本書的第一章內容在我們的那一條,這個時候我們對章節,對章來做索引就可以了,但是我們要去查詢第一章的第二小節,如果我們建立索引之建立了章的索引,那我要找到一地章,把第一章的所有小結在掃一遍。這樣索引是可以用到,但是索引的範圍有點大,為了降低索引範圍我們可以對小節做索引。我們對我們的章,對我們的節同時建立乙個組合索引,這樣我們在建立第一章的第二小節快速定位到這樣乙個內容。

5.外來鍵索引:只有innodb型別的表才能使用外來鍵索引,保證資料的一致性實現級聯操作。

6.全文索引:mysql自帶的全文索引只能用於myisam並且只能對英文進行全文索引。

外來鍵和全文基本上不去用的,外來鍵通常使用我們的業務邏輯來實現我們的關聯。

全文索引由於只能英文,並且只能myisam限制比較多。要想用全文檢索可以使用全文檢索引擎。

2另外索引列的基數越大,索引效果越好

3對字串進行索引應該制定乙個字首長度,可以節省大量索引空間

4.根據情況建立復合索引,它可以提高查詢效率,比如對章和節同時建立復合

5.避免建立過多索引,索引會額外占用磁碟空間,降低些操作效率

6.主鍵盡可能選擇較短的資料型別,可以有效減少索引的磁碟占用,提高查詢效率,比如選擇整形這樣的型別

注意事項:

1復合索引遵循字首原則

假設建立復合索引key(a,b,c)

加上where a=1 and b=2and c=3生效

where a=1 andb=2也可以生效  

where a=1也可以生效

不生效where b=2 and c=3這衝情況下這種索引不會被使用到,因為他跳過a

wherea=1 and c=3 也不行因為跳過b了

我們需要連續

注意,不是對a、b、c分別建立索引,而是建立乙個索引,同時作用在a、b、c的組合,效果是縮短查詢的範圍。比如a是章,b是小節,c是段落

2 like查詢  %不能在前 可以使用全文索引

比如說寫個where條件 where namelike 「%wang%」內容包含wang的。如果寫出這樣的,包換wang兩邊都要%,如果不加就是wang開頭,即使內部建立了索引也會失效。因為like接%就會失效,去掉就生效。如果就想找包含wang的可以使用全文檢索引擎比如es。

3.column is null可以使用索引

4.如果mysql估計使用索引比全盤掃瞄慢會放棄使用索引

比如一張表100調資料 比如寫條件,where id>1and id<100

即使對id常見了索引我們搜尋不是搜尋2-99嗎,所以我們先找2在哪,定位索引再去找資料行,然後找3…

這樣來說多了乙個查詢索引的步驟

mysql認為本身將就100條資料要查98條都要看索引,就很慢了

不如直接掃一遍100條資料,返回其中98.

這樣效率會更高,前者會自動放棄。這是優化器做的事。

5.如果or前的條件中列有索引,後面的沒有,索引都不會被用到

比如寫個where a or b  a有索引 b沒有就會失效

6.列型別是字串型,查詢時一定要給值加引號,否則索引失效

比如說name varchar(16)乙個列

存的時候存了」100」字串

搜尋是寫where name = 100;

能搜到,但是索引用不到,即使對name建立了索引,索引也會失效

因為人家本身是字串,現在變成整形

應該where name = 「100」

mysql高效能索引 mysql高效能索引( )

在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

mysql高效能索引設計

索引是儲存引擎用於快速找到記錄的一種資料結構,這是索引的基本功能。可以把資料庫的理解成一本書,而索引就是這本書的索引 每個章節在第幾頁 如果你知道你想查詢的章節名稱,就可以快速的通過索引找到這一章索引的頁數,而在資料庫中也類似,儲存引擎會先在索引中找到對應的值 主鍵或者實體地址,不同的儲存引擎儲存的...