MySQL中Cardinality問題總結

2021-10-13 21:45:24 字數 1558 閱讀 5717

1. 怎麼檢視索引是否具有高可用性?

答:使用以下語句,檢視結果的cardinality一欄,如果顯示的是100,那就說明該欄位存在100個不重複的項,這時根據實際情況決定是否保留該索引。但是,cardinality的結果卻並不是非常精確的,只能當其是乙個預估值,在索引的操作很頻繁時(insert和update時),統計cardinality的值是耗時的,因此該統計是利用取樣的方式進行的。

show index from table_name;
2. innodb儲存引擎內部對cardinality資訊更新發生在什麼時候?答:存在以下兩種策略:

​ 第一種:(計數變化)自從上次統計cardinality值後,表中的1/16的資料已經發生過變化,這是需要更新cardinality資訊;

​ 第二種:(內容變化,計數不變)如果對錶中某一行資料頻繁地進行更新操作,這時表中的資料實際並沒有增加,實際發生變化的還是這一行資料,則第一種更新策略就無法適用這種情況,因此在innodb儲存引擎內部有乙個計數器start_modified_counter,用來表示發生變化的次數,當start_modified_counter>2 000 000 000時,則同樣更新cardinality資訊。

3. innodb儲存引擎內部對於cardinality資訊的統計和更新操作是什麼樣的?

答:先獲取葉子節點的數量,記為n,再隨機選擇8個葉子節點,每個葉子節點統計不同記錄的個數c1、c2、c3、…,通過計算獲取預估值,cardinality=((c1 + c2 + … + c8) / 8) * n。

思考一下,既然是使用隨機取樣的方式進行統計,那麼就肯定無法保證每次獲取的cardinality值都保持相同,除非是葉子節點小於等於8,那麼來9驗證一下,以下分別是兩次查詢的結果:

4. 其他注意事項

a. 問題4中,提到的隨機選擇8個葉子節點,在innodb1.2版本之前,是可以通過引數 innodb_stats_sample_pages進行手動設定的;

b. 對於資料庫**現的null值,可以通過innodb_stats_method=nulls_equal將所有的null值當作相等的記錄,通過innodb_stats_method=nulls_unequal將所有的null值當作不同的記錄,通過innodb_stats_method=nulls_ignored將所有的null值設定為忽略null值記錄;

c. 當執行sql語句analyze table、 show table status、 show index和訪問information_schema架構下的表tables和 statistics時會導致innodb儲存引擎去重新計算索引的 cardinality值,如果資料量大,且索引較多,那可能要等需要耐心等候一下了。

參考文獻

php中mysql函式 php中mysql有關函式

1.mysql query 一般是用來查詢資料裡面的資料。如 username post name sql select from members where login name username result mysql query sql 以上程式是檢測資料庫中是否存在表單傳送過來的使用者名稱...

mysql中 變數 mysql中的變數

toc 變數 mysql本質是一種程式語言,需要很多變數來儲存資料。mysql中很多的屬性控制都是通過mysql中固有的變數來實現的。系統變數 系統內部定義的變數,系統變數針對所有使用者 mysql客戶端 有效。檢視系統所有變數 show variables like pattern mysql允許...

mysql中 變數 MYSQL中的變數 MySQL

bitscn.com 只記很基礎的知識,細節東西太麻煩了,而且我也用不到。變數分為使用者變數與系統變數。使用者變數 使用者變數與資料庫連線有關,在這個連線中宣告的變數,在連線斷開的時候,就會消失。在此連線中宣告的變數無法在另一連線中使用。使用者變數的變數名的形式為 varname的形式。名字必須以 ...