mysql筆記系列 九 mysql如何選擇索引的

2021-10-04 02:55:08 字數 1846 閱讀 6752

12.mysql如何選擇索引的

12.1 補充索引的知識:

1.建立索引慢,刪除索引快,是因為建立索引的時候生成索引檔案,而且刪除的時候是標記刪除,相當於打了乙個失效標記,所以快。

2.執行器呼叫儲存引擎的介面只能獲取到原始的資料,後續的order join group 等都在server層進行,資料過濾除了索引下推之外,也是在server層進行。

12.2 一張表可以有多個索引,具體選擇哪個索引由優化器決定,優化器會嘗試選擇乙個代價最小的索引。

代價有:

1.掃瞄行數 2.是否使用臨時表 3.是否排序

掃瞄行數的預估:

mysql在真正執行語句之前,無法精確知道滿足這個條件的記錄有多少條,因此是通過統計資訊來預估記錄數的。

統計資訊就是索引的區分度,乙個索引上不同的值越多,區分度越大,乙個索引上不同值的個數 也叫基數「cardinality」。

使用show index from table (table為表名) 命令 可以看乙個索引的基數

這個基數是通過取樣統計得到的,innodb預設取n個資料頁,統計這個頁面上的不同的值,得到乙個平均值,然後乘以這個索引的頁面數,就得到了這個索引的基數。

資料表是持續更新的,當變更的資料行數超過了1/m 會自動觸發重新做一次索引統計。

在 mysql 中,有兩種儲存索引統計的方式,可以通過設定引數 innodb_stats_persistent 的值來選擇:

設定為 on 的時候,表示統計資訊會持久化儲存。

這時,預設的 n 是 20,m 是 10。 設定為 off 的時候,表示統計資訊只儲存在記憶體中。

這時,預設的 n 是 8,m 是 16

12.3手動重新整理索引的統計資訊

analyze table 表名

手動重新整理是很有用的,很多時候mysql用錯了索引,是因為預估行數錯了,用這個命令重新整理之後 可以恢復。

注意:並非一定會選掃瞄行數少的索引,還要考慮到其他情況,比如說回表的代價,假設掃瞄a索引 需要3萬行,但是每行都要去主鍵索引上回表一次, 但是掃瞄b索引要五萬行,卻不需要回表,那麼選擇b更合理。

注意:主鍵是直接按照表的行數來估計的,而表的行數,優化器直接用的 是 show table status 表名 的查出來的值。

12.4 索引選擇錯誤的處理

1.手動採用 force index 強行選擇乙個索引 例如select xx from t force index(a) where a=xx

這個一般在自己的手動查詢裡面使用,不建議在**中用,因為萬一後面索引改了 這個語句也要改。

而且 出現這種情況,大概率是索引設計不合理 或者查詢語句不夠優化等。

2. 優化索引或者優化查詢,比如說去掉無關索引,或者優化查詢中的涉及到排序,或者新建乙個更合適的索引。

13.怎麼給字串加索引

如果字串很長,建議使用字首索引

alter table *** add index index1(email); 非字首索引

alter table *** . add index index2(email(6)); 字首索引,字首6個字元

使用字首索引的時候,應該盡可能的選擇盡量大的基數(區分度)的長度,

可以使用select count(distinct left(列名,長度)) 來統計不同的值,找到乙個合適的字首長度

字首索引的缺點是 不能有效利用索引覆蓋,即使索引上有,也要去主鍵索引上再查一次。

其他情況

1.如果字首區分度不高的話,比如說某些字首都是一樣的場景,那麼就可以倒轉之後再存,取的時候反轉就行了。

2.使用hash,存的時候多存一列,存這個字串的hash值,然後在這個列上建索引,這樣就可以極大減少索引的空間。

但是以上兩種都不支援範圍查詢,需要根據業務酌情使用。

MySQL學習筆記(九) MySQL儲存過程

日期 2020 12 01 好處 提高 的重用性,簡化操作 儲存過程 含義 一種預先編譯好的sql語句的集合,理解成批處理語句。好處 create procedure 儲存過程名 引數列表 begin 儲存過程體 一組合法的sql語句 end注意 引數列表包含三部分,引數模式,引數名,引數型別 引數...

MYSQL學習筆記九(索引)

1.1 概念 在mysql中,索引的關鍵字為index也叫做 鍵 key 是儲存引擎用於快速找到記錄的一種資料結構。當表中的資料量越來越大時,索引對於良好的效能非常關鍵。索引優化應該是對查詢效能優化最有效的手段,建立乙個真正最優的索引經常需要重寫sql查詢語句。注意 索引一般建立在經常的查詢的字段上...

mysql基礎系列之九 子查詢

什麼是子查詢語句?指在一條select語句中,嵌入了另一條select語句,那麼被嵌入的select語句就稱之為子查詢語句。什麼是子查詢?當乙個查詢是另乙個查詢的條件時,該查詢稱之為子查詢。在計算機中語言select sql語句中,子查詢就是巢狀查詢下層的程式模組。標量子查詢 返回乙個資料 一行一列...