MySQL的統計信息學習總結

来源:https://www.cnblogs.com/kerrycode/archive/2019/11/08/11821042.html

統計信息概念 MySQL統計信息是指資料庫通過採樣、統計出來的表、索引的相關信息,例如,表的記錄數、聚集索引page個數、欄位的Cardinality....。MySQL在生成執行計劃時,需要根據索引的統計信息進行估算,計算出最低代價(或者說是最小開銷)的執行計劃.MySQL支持有限的索引統計信息,... ...


統計信息概念

 

MySQL統計信息是指資料庫通過採樣、統計出來的表、索引的相關信息,例如,表的記錄數、聚集索引page個數、欄位的Cardinality....。MySQL在生成執行計劃時,需要根據索引的統計信息進行估算,計算出最低代價(或者說是最小開銷)的執行計劃.MySQL支持有限的索引統計信息,因存儲引擎不同而統計信息收集的方式也不同. MySQL官方關於統計信息的概念介紹幾乎等同於無,不過對於已經接觸過其它類型資料庫的同學而言,理解這個概念應該不在話下。相對於其它資料庫而言,MySQL統計信息無法手工刪除。MySQL 8.0之前的版本,MySQL是沒有直方圖的。

 

統計信息參數

 

MySQL的InnoDB存儲引擎的統計信息參數有7(個別版本有8個之多),如下所示:

 

MySQL 5.6.41 有8個參數:

 

mysql> show variables like 'innodb_stats%';
+--------------------------------------+-------------+
| Variable_name                        | Value       |
+--------------------------------------+-------------+
| innodb_stats_auto_recalc             | ON          |
| innodb_stats_include_delete_marked   | OFF         |
| innodb_stats_method                  | nulls_equal |
| innodb_stats_on_metadata             | OFF         |
| innodb_stats_persistent              | ON          |
| innodb_stats_persistent_sample_pages | 20          |
| innodb_stats_sample_pages            | 8           |
| innodb_stats_transient_sample_pages  | 8           |
+--------------------------------------+-------------+
8 rows in set (0.00 sec)

 

MySQL 8.0.18 有7個參數:

 

mysql> show variables like 'innodb_stats%';
+--------------------------------------+-------------+
| Variable_name                        | Value       |
+--------------------------------------+-------------+
| innodb_stats_auto_recalc             | ON          |
| innodb_stats_include_delete_marked   | OFF         |
| innodb_stats_method                  | nulls_equal |
| innodb_stats_on_metadata             | OFF         |
| innodb_stats_persistent              | ON          |
| innodb_stats_persistent_sample_pages | 20          |
| innodb_stats_transient_sample_pages  | 8           |
+--------------------------------------+-------------+

 

關於這些參數的功能,下麵做了一個大概的整理、收集。

 

 

參數名稱

參數意義

innodb_stats_auto_recalc

是否自動觸發更新統計信息。當被修改的數據超過10%時就會觸發統計信息重新統計計算

innodb_stats_include_delete_marked

控制在重新計算統計信息時是否會考慮刪除標記的記錄。

innodb_stats_method

null值的統計方法

innodb_stats_on_metadata

操作元數據時是否觸發更新統計信息

innodb_stats_persistent

統計信息是否持久化

innodb_stats_sample_pages

不推薦使用,已經被innodb_stats_persistent_sample_pages替換

innodb_stats_persistent_sample_pages

持久化抽樣page

innodb_stats_transient_sample_pages

瞬時抽樣page

 

 

參數innodb_stats_auto_recalc

 

 

該參數innodb_stats_auto_recalc控制是否自動重新計算統計信息,當表中數據有大於10%被修改時就會重新計算統計信息(註意,由於統計信息重新計算是在後臺發生,而且它是非同步處理,這個可能存在延時,不會立即觸發,具體見下麵介紹)。如果關閉了innodb_stats_auto_recalc,需要通過analyze table來保證統計信息的準確性。不管有沒有開啟全局變數innodb_stats_auto_recalc。即使innodb_stats_auto_recalc=OFF時,當新索引被增加到表中,所有索引的統計信息會被重新計算並且更新到innodb_index_stats表上。

 

 

 

下麵驗證一下系統變數innodb_stats_auto_recalc=OFF時,創建索引時,會觸發該表所有索引重新統計計算。

 

mysql> set global innodb_stats_auto_recalc=off;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like 'innodb_stats_auto_recalc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_stats_auto_recalc | OFF   |
+--------------------------+-------+
1 row in set (0.00 sec)
 
mysql> select * from mysql.innodb_index_stats 
    -> where database_name='MyDB' and table_name = 'test';
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name | index_name      | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| MyDB          | test       | GEN_CLUST_INDEX | 2019-10-28 14:54:48 | n_diff_pfx01 |          2 |           1 | DB_ROW_ID                         |
| MyDB          | test       | GEN_CLUST_INDEX | 2019-10-28 14:54:48 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| MyDB          | test       | GEN_CLUST_INDEX | 2019-10-28 14:54:48 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
3 rows in set (0.00 sec)
 
mysql> create index ix_test_name on test(name);
mysql> select * from mysql.innodb_index_stats 
    -> where database_name='MyDB' and table_name = 'test';
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name | index_name      | last_update   &n

您的分享是我們最大的動力!

更多相關文章
  • 創建用戶 我們創建的這個用戶要放到 sudo 用戶組,以便於我們可以執行一些需要 root 許可權的操作。 最後一步是給 username 用戶設置一個密碼,方便遠程登錄主機使用。建議密碼要設置的相對複雜一些,避免被黑客猜測到密碼。 磁碟掛載 如果主機上有額外的磁碟,需要在操作系統進行掛載。磁碟分區、 ...
  • 1.安裝環境 Docker支持以下的CentOS版本 CentOS 6.5 (64-bit) 或更高的版本 Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 1 [[email protected] ~]# unam ...
  • 參數|介紹 |: : maxThreads|最大可以創建請求的線程數 minSpareThreads|服務啟動時創建的處理請求的進程數 Connector中的port|創建伺服器端的埠號,此埠監聽用戶端的請求 enableLookups|如果為true,則可以通過調用request.getRem ...
  • 如何解決問題:程式無法正常啟動(0xc0000022) 下文是由NeoSmart技術,通過全球網路上的工程師開發者和技術人員一起收集起來的信息,進行彙總並編輯而成的。 錯誤現象 該錯誤一般會通過警告,錯誤,提示等形式在屏幕上提示0xc0000022 觸發錯誤的方式 文件占用或者訪問異常 安全軟體 缺 ...
  • 一、LK中亮屏流程 1. gcdb_display_init(),進行display初始化的起始地方; 2. oem_panel_select(),在這裡去選擇哪一款屏,也可以在這裡添加新一款屏; 3. dsi_panel_init()把屏頭文件中的配置信息拷貝到結構體中,並一些屏需要的配置; 4. ...
  • 主備切換在備庫startup時出現歸檔路徑沒寫到spfile里...註意:修改參數時最好帶上scope=spfile或scope=both,以免重啟出現異常。SQL> startup mountORA-16032: parameter LOG_ARCHIVE_DEST_1 destination s ...
  • 相關資料:https://zhuanlan.zhihu.com/p/70701037 https://zhuanlan.zhihu.com/p/59061106 一、事務。 1、概念。事務是由一組SQL語句組成的邏輯處理單元。 2、事務的屬性(ACID)。 i:原子性(atomicity):事務是最 ...
  • 算是 ...
一周排行
  • C 語法糖——持續更新 1. return的switch寫法 ...
  • 0. 前言 繼上一篇,以及上上篇,我們對SqlSugar有了一個大概的認識,但是這並不完美,因為那些都是理論知識,無法描述我們工程開發中實際情況。而這一篇,將帶領小伙伴們一起試著寫一個能在工程中使用的模板類。 1. 創建一個Client SqlSugar在操作的時候需要一個Client,用來管理數據 ...
  • 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //數組:長度不可變,類型單一 6 //ArrayList集合:長度可以任意改變,類型可以不單一 7 8 //創建一個ArrayList對象 9 ArrayList mylist ...
  • .NET 程式下銳浪報表 (Grid++ Report) 的綠色發佈指南 在銳浪報表官方為 CSharp 編寫的開發文檔:“在C#與VB.NET中開始使用說明.txt” 中,關於發佈項目是這麼描述的: ★發佈你的項目,用VS.NET製作安裝程式:1、先創建安裝項目:在解決方案資源管理器的根節點上點右 ...
  • 執行代碼清理時,可以點擊那個掃把小圖片,會按照預設的第一種配置文件來自動修複。也可以點擊下拉三角符合,選擇不同的配置文件,然後進行修複。或者快捷鍵Ctrl+K,Ctrl+E。 針對每一項配置的說明: 刪除不必要的using 儘可能將私有欄位設置為只讀 刪除不必要的類型轉換(針對強類型轉換),像Con ...
  • 1.概念簡述 (1)AR模型 AR 模型(auto regressive model)自回歸模型,模型參量法高解析度譜分析方法之一,也是現代譜估計中常用的模型。 用AR模型法求信具體作法是: ①選擇AR模型,在輸入是衝激函數或白雜訊的情況下,使其輸出等於所研究的信號,至少,應是對該信號的一個好的近似 ...
  • 4.元組 元組的主要特性為: 1.元組在創建之後,具有不可以更改的特性,因此不能直接給元組的元素賦值 2.元組的元素類型可以為任意類型,如字典、字元串、列表等 3.元組常用於在程式的整個生命周期中都不變的場景中 4.1 常用方法 元組大小和內容在定義賦值之後,就不可更改,常用的方法如下所示: cou ...
  • 老孟導讀:今天分享一個類似“孔雀開屏”的動畫效果,打開新的頁面時,新的頁面從屏幕右上角以圓形逐漸打開到全屏。 先來看下具體的效果 不知道這種效果大家叫什麼名字?如果有更合適的名字可以在評論處告訴我,下麵來說下如何實現此效果。 在使用Navigator進入一個新的頁面時,通常用法如下: 就包含了切換頁 ...
  • hashCode() 和equals() 方法的重要性體現在什麼地方? Java中的HashMap使用hashCode()和equals()方法設置值,根據鍵獲取值的時候也會用到這兩個方法。 怎樣 設置 的值? hashCode()獲得 hash值。而hash值用來確定hashmap中內部 Node ...
  • IDEA一些不錯的插件分享 目錄 IDEA一些不錯的插件分享 插件集合 CamelCase Translation LiveEdit MarkDown Navigator Jrebel CheckStyle IDEA Alibaba Java Coding Guidelines Ideavim Ma ...