MySQL的統計信息學習總結

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

統計信息概念 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

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

-Advertisement-
Play Games
更多相關文章
  • 創建用戶 我們創建的這個用戶要放到 sudo 用戶組,以便於我們可以執行一些需要 root 許可權的操作。 最後一步是給 username 用戶設置一個密碼,方便遠程登錄主機使用。建議密碼要設置的相對複雜一些,避免被黑客猜測到密碼。 磁碟掛載 如果主機上有額外的磁碟,需要在操作系統進行掛載。磁碟分區、 ...
  • 1.安裝環境 Docker支持以下的CentOS版本 CentOS 6.5 (64-bit) 或更高的版本 Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 1 [root@tenghao510 ~]# 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):事務是最 ...
  • 算是 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...