面試題 談談MySQL的基數統計

2021-10-10 10:39:03 字數 1957 閱讀 8921

推薦閱讀方式

使用推薦閱讀,有更好的閱讀體驗

一、基數是啥?

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更新基數(即使你並沒有意識到它會更新基數)。

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

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

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

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

參考:

關注我以問答的方式,由淺入深的幫你應對各類mysql面試題的狂轟濫炸!當然也不乏會分享一些高階讀寫分離資料庫中介軟體原理及落地的技術實現,為你揭開資料庫中介軟體神秘的面紗!

面試官都關注了!你還在猶豫什麼呢?

mysql 不用怕面試題 MySQL 面試題

資料庫事務的四個特性及含義原子性 atomicity 一致性 correspondence 隔離性 isolation 永續性 durability 原子性 整個事務中的所有操作,要麼全部完成,要麼全部不完成。事務在執行過程中發生錯誤,會被回滾 rollback 到事務開始前的狀態,就像這個事務從來...

MySQL的基數統計

一 基數是啥?cardinality指的就是mysql表中某一列的不同值的數量。如果這一類是唯一索引,那基數 行數。如果這一列是 列舉型別只有男女,那它是基數就是2 cardinality越高,列就越有成為索引的價值。mysql執行計畫也會基於cardinality選擇索引。通過下面的方式可以看到表...

mysql資料結構面試題 MySQL 面試題

mysql 的一些面試題,有的是平時聊到的,有的是聽別人說的,有的是工作中遇到的,特此彙總一下,有問有答。一條 sql 查詢語句執行流程?1 聯結器。客戶端和伺服器 tcp 握手後,驗證使用者名稱密碼。使用者名稱密碼通過後,聯結器會到許可權表中查詢你擁有的許可權。之後這個連線裡面的許可權判斷邏輯,都...