MySQL的基數統計

2021-10-10 12:33:43 字數 1405 閱讀 6741

一、基數是啥?#

cardinality指的就是mysql表中某一列的不同值的數量。

如果這一類是唯一索引,那基數 = 行數。

如果這一列是***,列舉型別只有男女,那它是基數就是2

cardinality越高,列就越有成為索引的價值。mysql執行計畫也會基於cardinality選擇索引。

通過下面的方式可以看到表中各列的基數。

比如這個經典的例子:

有一列為***,那對於***列中儲存的值來說 非男即女,它的基數最大就是2。

那也就完全沒有必要為***建立索引。因為,為了提公升你基於***的查詢速度,mysql會為你選擇的這個新索引建立一棵全新的b+tree。但你***只有兩種值,對於mysql來說,即使它為你指定的列建立了b+tree索引,真正執行查詢時,最多進行一次二分查詢,剩下的操作只能是遍歷,所以為***建立索引意義不大。

二、innodb更新基數的時機?#

引數:innodb_stats_auto_recalc控制mysql是否主動重新計算這些永續性的資訊。預設為1表示true,0表示false。

預設情況下當表中的行變化超過10%時,重新計算基數資訊。

三、基數是估算出來#

基數並不會實時更新!而且它是通過取樣估算出來的值!

至於基數的公式是怎樣的,可能並不重要。

重要的是你得知道,他是通過隨機取樣資料頁的方式統計出來的乙個估算值。

而且隨機取樣的頁數可以通過引數innodb_stats_persistent_sample_pages 設定,預設值是20。

這就意味著 基數值並不準確,甚至你每次計算的結果相擦還是蠻大的。

四、持久化基數#

可以通過引數innodb_stats_persistent 控制是否持久化基數,預設為off。

當然你可以為乙個單獨的表設定 stats_persistent=1 那麼它的 innodb_stats_persistent將自動被啟用。

開啟它的好處是:重啟mysql不會再重複計算這個值,加快重啟速度。

四、如何主動更新基數?#

執行下面的sql時都會觸發innodb更新基數(即使你並沒有意識到它會更新基數)。

所以盡量選擇乙個業務低峰期

analyze table tablename;

如果因為取樣的數量太少了,計算的基數錯的離譜。那很可能會導致mysql的優化器選錯索引。這是你可以將這個值適當調大。但是增加 太多可能會導致 analyze table執行緩慢。

反之, analyze table執行太慢。你可以適度調整引數innodb_stats_persistent_sample_pages 的值。但是這又可能導致基數計算的不準確。

如果沒有辦法平衡兩者的關係。可以考慮減少表中索引列的數量或限制分割槽的數量以降低 analyze table複雜性。表的主鍵中的列數也很重要,因為主鍵列被附加到每個非唯一索引中。

面試題 談談MySQL的基數統計

推薦閱讀方式 使用推薦閱讀,有更好的閱讀體驗 一 基數是啥?cardinality指的就是mysql表中某一列的不同值的數量。如果這一類是唯一索引,那基數 行數。如果這一列是 列舉型別只有男女,那它是基數就是2 cardinality越高,列就越有成為索引的價值。mysql執行計畫也會基於cardi...

mysql 基數 MySQL 索引基數

mysql 索引基數 簡介 在本教程中,您將了解mysql索引基數以及如何使用show indexes命令檢視索引基數。索引基數是指儲存在索引中指定列中的值的唯一性。mysql基於儲存為整數的統計資訊生成索引基數,因此,值可能不一定精確。查詢優化器使用索引基數為給定查詢生成最佳查詢計畫。它還使用索引...

mysql基數是什麼 MySQL中的基數是什麼?

在mysql中,基數一詞是指可以放入列中的資料值的唯一性。它是一種屬性,會影響搜尋,聚類和排序資料的能力。基數可以分為以下兩種型別 低基數 列的所有值必須相同。高基數 列的所有值必須唯一。如果我們在列上施加約束以限制重複值,則使用高基數的概念。高基數以下是高基數的示例,其中列的所有值都必須是唯一的。...