mysql檢視索引,執行計畫,聯合索引

2021-10-03 11:39:07 字數 2771 閱讀 6614

一,檢視t2表的索引:

mysql> show index from t2 \g

*************************** 1. row ***************************

table: t2

non_unique: 0

key_name: primary

seq_in_index: 1

column_name: id

collation: a

cardinality: 0

sub_part: null

packed: null

null:

index_type: btree

comment:

index_comment:

collation: a 列以什麼方式儲存在索引中,可以是a或null,b+樹索引總是a,即排序的。

cardinality:非常關鍵的值,表示索引中唯一值的數目的估計值,cardinality除以表的行數應盡可能接近1,

如果非常小,那麼使用者考慮是否可以刪除該索引。

index_type: btree #索引的型別,innodb儲存引擎只支援b+樹索引,所以這裡顯示的都是btree。

cardinality:值非常關鍵,優化器會根據這個值來判斷是否使用這個索引,這個值並不是實時更新的,

即並非每次索引更新都會更新該值,因為這樣代價非常大,因此該值不太準確,

如果想要更新cardinality,可以使用analyze table;

mysql5.5之前,對於資料庫索引的新增或刪除這類ddl操作,mysql的操作過程為:

首先建立一張新的臨時表,表結構通過alter table新定義的結構

然後把原表中資料匯入到臨時表。

接著刪除原表

然後把臨時表命名為原來的表。

可以發現,若使用者對於一張大表進行索引的新增或刪除工作,那麼需要很長的時間,若有大量事物需要訪問被修改的表,

這意味著資料庫不可用,後來mysql開始支援一種新的叫做 fast index creation的索引建立方式 fic.

對於輔助索引的建立,innodb儲存引擎會對建立索引的表加上乙個s鎖,在建立過程中不需要重建表,

因此速度較之前快很多,並且資料庫的可用性得到提高,刪除輔助索引就更簡單了,innodb儲存引擎只需更新內部檢視

並將輔助索引的空間標記為可用,同時刪除mysql資料庫內部檢視上對該錶的索引定義即可。

這裡需要特別注意的是,臨時表的建立路徑是通過引數tmpdir進行設定的,使用者必須保證tmpdir有足夠的空間可以

存放臨時表,否則會導致建立臨時表失敗。

由於fic在索引建立的過程中對錶加了s鎖,因此建立的過程中只能對該錶讀,此外,fic

cardinality

並不是在所有的查詢條件**現的列都需要新增索引,對於什麼時候新增b+樹索引?

一般的經驗是:在訪問表中很少一部分時使用b+樹索引才有意義,

對於性別字段,地區字段,型別字段,他們的取值範圍很小,稱為低選擇性。

對性別進行查詢時,可取值的範圍一般只有 m f ,因此上述sql語句得到的結果可能是該錶50%的資料。

怎樣檢視索引是否是高選擇性的呢?

可以通過show index 結果中的列cardinality來觀察,cardinality值非常關鍵,表示索引中不重覆記錄數量的預估值。

需要同時注意的是cardinality是乙個預估值,而不是乙個準確值,基本上使用者也不可能得到乙個準確值。

cardinality/n_rows_in_table應盡可能地接近1,若果太小,可考慮放棄該索引。

建立索引的前提是高選著性,cardinality的統計是**儲存引擎層完成的。

在生產環境中,索引的更新操作可能是非常頻繁的,如果每次索引在發生操作時就對其進行cardinality的統計,

那麼將給資料庫帶來非常大的負擔,此外如果一張表有50g的資料,那麼統計一次cardinality將要非常耗時,

在生產環境也是不能接受的,因此資料庫對於cardinality的統計是通過取樣(sample)的方法來完成的。

innodb儲存引擎內部對更鬧心cardinality資訊的策略為:

1 表中1/16的資料已發生變化。

自上次統計後,表中1/16的資料發生了變化,這時需要統計cardinality。

2 stat_modified_counter>2 000 000 000

預設innodb儲存引擎對8個葉子節點進行取樣,取樣過程如下:

取得b+樹索引葉子節點的數量,計為a。

隨機取得b+樹索引中的8個葉子節點,統計每個頁不同的個數,p1,p2…p8

根據取樣資訊給出cardinality的預估值;cardinary=(p1+p2+…p8)*a/8

可以通過innodb_stats_sample_pages 設定統計cardinality時每次取樣頁的數量,預設8,(已經被innodb_stats_transisent_sample_pages引數取代)

引數innodb_stats_method用來判讀如何對待索引記錄**現的null值記錄。預設nulls_equal,表示將null值記錄視為相等的記錄

其有效值還有 nulls_unequal,nulls_ignored

另外當執行 sql語句ananlyze table ,show table status,show index 以及訪問information_schema架構下的表tables和statistics

時都會導致innodb儲存引擎去重新計算索引的cardinality值,

若表中的資料量巨大,且存在多個輔助索引,執行上述命令會非常慢。

MYSQL檢視執行計畫

1 概述 執行計畫的檢視是進行資料庫的sql語句調優時依據的乙個重要依據,mysql的執行計畫檢視相對oracle簡便很多,功能也相對簡單很多的sql語句都不能直接檢視。2 執行計畫的生成和檢視 2.1 執行計畫的生成方法 explain select 生成的方法很簡單在相應的select前面加ex...

mysql檢視執行計畫

檢視執行計畫的目的 優化sql效能 測試版本 mysql5.7 首推官網文件,有對照表 測試表結構 create table test index1 int 11 not null,index2 int 11 not null,value varchar 255 not null default p...

MYSQL檢視執行計畫

1 概述 執行計畫的檢視是進行資料庫的sql語句調優時依據的乙個重要依據,mysql的執行計畫檢視相對oracle簡便很多,功能也相對簡單很多的sql語句都不能直接檢視。本文件整理了mysql執行計畫的生成方法和檢視。2 執行計畫的生成和檢視 2.1 執行計畫的生成方法 explain select...