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語句中,子查詢就是巢狀查詢下層的程式模組。標量子查詢 返回乙個資料 一行一列...