天天看點

mysql5.7官網直譯優化和索引--索引統計的收集

8.3.7 InnoDB and MyISAM Index Statistics Collection 索引統計收集

存儲引擎收集統計關于使用了優化政策的表。表統計是基于值分組的,其中一個組的值都是基于相同的key字首值。而對于優化器的作用,一個重要的統計是平均組值的大小。

mysql使用組大小的平均值在如下地方:

>為了評估每一個ref方法必須要讀取多少行資料

>為了評估一個部分的連接配接将會産生多少行資料;也就是說,一個這種形式的操作會産生多少行的資料:(...) JOIN tbl_name ON tbl_name.key = expr

當組值的平均大小對于一個索引是增加的,索引對于這樣的兩個目的是沒有啥用因為每行的查找數量都在增加:通過索引來達到很好的優化目的,它最好是對于每一個索引值在表中都有很少數量的行。當給出一個值會産生大量的行,索引的作用會很小并且mysql可能不會使用它。

組值的平均數量和表的基數相關,也就是組值的數量。SHOW INDEX 語句展示了一個基數值基于N/S,其中N是表中的行數,S是組值的平均數。這個比例就是表中組數的大概數量。

對于一個基于<=>操作的連接配接,NULL 不會差別對待從其他值中:NULL<=>NULL,就像N<=>N對于其他N。

然而,一個基于=操作的連接配接。NULL 是不同于non-NULL值的:expr1=expr2不是true,當expr1或者是expr2(或者兩個都是)是NULL。這影響了ref方法對于比較形式為tb1_name.key=expr:mysql将不會通路表,如果目前表達式expr是NULL,因為對比不可能是true.

對于=比較,它不會比對有多少NULL值在表中。因為優化的目的,相關值是一個平均了non-NULL值的組值的平均大小。然而,mysql不能立即使用或者是收集平均大小。

對于InnoDB和MyISAM表,你能有一些控制關于表統計的收集,方法是innodb_stats_method和myisam_stats_method系統變量。這些變量可能有三個值,他們分别如下:

1)當變量的值設定為nulls_equal,所有的NULL值被單獨處理(也就是說,他們所有的值形成一個組);

  如果null值組的大小遠大小非null值組的平均大小,那麼這種方法會使得平均組大小變大。這可能使得索引對優化器的作用并沒有他實際在連接配接中的作用大對于查找非null值。是以,nulls_equal方法可能使得優化器不使用索引在ref方法中,雖然它應該被使用。

2)當變量的值設定為nulls_unequal,NUll值不會被相同的對待。而是,每個NULL值都是獨立的一個組且組内的數目為1.

3)當變量的值設定為nulls_ignored,Null值會被忽略。

如果你更傾向于使用多個連接配接使用<=>而不是=,NULL值是不會被單獨對比的并且NUll值之間是相等的。在這種情況下,nulls_equal是一個不錯的統計方法。

系統變量innodb_stats_method是一個全局變量;系統變量myisam_stats_method即是全局的又是session的值。設定全局的變量值會影響目前存儲引擎上的所有表的統計集合。設定session值隻會影響目前連接配接中的統計值。這也就意味着你可以通過設定session值關于myisam_stats_method的變量來強制更新表統計給出的方法,而不影響其他用戶端的操作。

為了更新myISAM表統計,你能使用下面的方法:

>執行myisamchk --stats_method=method_name --analyze指令

>通過改變表來引發統計表的方法已經過時(例如插入資料或是删除資料),并且設定myisam_stats_method和發起一個ANALYZE_TABLE 語句。

一些警告關于使用innodb_stats_method和myisam_stats_method:

1)你能明确的強制表統計被收集,就像先前描述的一樣。然而,mysql也可以自動收集統計資料。例如如果在對一張表執行語句的過程中,一些其他語句修改了表,mysql也許會收集統計。(這也許發生在大量插入或者删除,或者是一些修改表的語句)如果中發生了,不管innodb_stats_method或者myisam_stats_method是什麼值,統計都會被及時的收集。這樣,如果你收集統計資料使用一個方法,但是系統變量設定為另一個方法在表統計收集是自然使用,其他方法會被使用。

2)沒有辦法知道哪一個方法會被使用産生統計對于一個給出的表

3)這些變量隻能拿應用在innoDB和MyISAM表中。其他存儲引擎隻有一種方法收集表的統計資料。通常是關閉的關于方法nulls_equal。

關于索引統計資訊的收集到這裡就結束了,接下來我們要說的是8.3.8 Comparison of B-Tree and Hash Indexes B-Tree索引和哈希索引的對比。