目錄
一、非持久化統計資訊
5.6.6開始,MySQL預設使用了持久化統計信息,即INNODB_STATS_PERSISTENT=ON,持久化統計信息保存在表mysql.innodb_table_stats和mysql. innodb_index_stats。
首頁 資料庫 mysql教程 MySQL統計資訊的詳細概述

MySQL統計資訊的詳細概述

Mar 05, 2018 pm 04:12 PM
mysql 資訊 統計

本篇文章透過統計資訊的概念介紹以及MYSQL統計資訊的優點等面向全面概述了MySQL統計資訊的相關知識點,希望可以幫助到有需求的朋友們。

MySQL執行SQL會經過SQL解析與查詢最佳化的過程,解析器將SQL分解成資料結構並傳遞到後續步驟,查詢最佳化器發現執行SQL查詢的最佳方案、產生執行計劃。查詢優化器決定SQL如何執行,依賴資料庫的統計信息,下面我們介紹MySQL 5.7中innodb統計資訊的相關內容。

MySQL統計資訊的儲存分為兩種,非持久化和持久化統計資訊。

一、非持久化統計資訊

非持久化統計資訊儲存在記憶體裡,如果資料庫重啟,統計資料將會遺失。有兩種方式可以設定為非持久化統計資訊:

#1 全域變量,

INNODB_STATS_PERSISTENT=OFF

2 CREATE/ALTER表的參數,

STATS_PERSISTENT=0

##非持久化統計資料在下列情況會自動更新:

##5 距上一次更新統計信息,表1/16的數據被修改#非持久化統計信息的缺點顯而易見,數據庫重啟後如果大量表開始更新統計訊息,會對實例造成很大影響,所以目前都會使用持久化統計資料。
1 執行ANALYZE TABLE

# 2 innodb_stats_on_metadata=ON情況下,執SHOW TABLE STATUS, SHOW INDEX, 查詢INFORMATION_SCHEMA下的TABLES, STATISTICS

3 啟用--auto-rehash功能情況下,使用mysql client登入

4 表第一次被開啟

二、持久化統計信息

5.6.6開始,MySQL預設使用了持久化統計信息,即INNODB_STATS_PERSISTENT=ON,持久化統計信息保存在表mysql.innodb_table_stats和mysql. innodb_index_stats。

持久化統計資料會自動更新以下情況:


1 INNODB_STATS_AUTO_RECALC=ON#2 增加新的索引 innodb_table_stats是表格的統計信息,innodb_index_stats是索引的統計信息,各字段含義如下:

情況下,表中10%的資料被修改

innodb_table_statsinnodb_table_statsdatabase_nametable_name

innodb_table_stats

innodb_table_stats

資料庫名稱

表格名稱

last_update
統計資料最後一次更新時間
表的行數聚集索引的頁的數量其他索引的頁的數量#innodb_index_stats#database_name資料庫名稱table_name
##n_rows

clustered_index_size

sum_of_other_index_sizes

##表名稱

index_name

#索引名稱
#### ##last_update############統計資料最後一次更新時間##################stat_name###################################################### ##統計資訊名稱###################stat_value############統計資料的值########## ########sample_size###############################stat_description############################################################################### ####類型說明###############

為更好的理解innodb_index_stats,建立一張測試表做說明:

CREATE TABLE t1 (
 a INT, b INT, c INT, d INT, e INT, f INT,
 PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f)
) ENGINE=INNODB;
登入後複製

寫入資料如下:

查看t1表的統計信息,需主要關注stat_name和stat_value字段

tat_name=size時:stat_value表示索引的頁的數量

stat_name=n_leaf_pages時:stat_value表示葉子節點的數量

stat_name=n_diff_pfxNN時:stat_value表示索引欄位上唯一值的數量,這裡做一下具體說明:

##1 、n_diff_pfx01表示索引第一列distinct之後的數量,如PRIMARY的a列,只有一個值1,所以index_name='PRIMARY' and stat_name='n_diff_pfx01'時,stat_value=1。

2、n_diff_pfx02表示索引前兩列distinct之後的數量,如i2uniq的e,f列,有4個值,所以index_name='i2uniq' and stat_name='n_diff_pfx02'時,stat_value=4。

3、對於非唯一索引,會在原有欄位之後加上主鍵索引,如index_name='i1' and stat_name='n_diff_pfx03',在原始索引列c,d後加了主鍵列a,( c,d,a)的distinct結果為2。

了解了stat_name和stat_value的具體意義,就可以協助我們排查SQL執行時為什麼沒有使用適當的索引,例如某個索引n_diff_pfxNN的stat_value遠小於實際值,查詢最佳化器認為該索引選擇度較差,就有可能導致使用錯誤的索引。

三、統計資料不準確的處理

我們查看執行計劃,發現未使用正確的索引,如果是innodb_index_stats中統計資訊差異較大引起,可透過以下方式處理:

1、手動更新統計信息,注意執行過程中會加讀鎖:

ANALYZETABLE TABLE_NAME;

2、如果更新後統計資訊仍不準確,可考慮增加表格採樣的資料頁,兩種方式可以修改:

a) 全域變數INNODB_STATS_PERSISTENT_SAMPLE_PAGES,預設為20;

b) 單一表格可以指定該表的取樣:

ALTER TABLE TABLE_NAME STATS_SAMPLE_PAGES=40;

#經過測試,此處STATS_SAMPLE_PAGES的最大值是65535,超出會報錯。

目前MySQL並沒有提供直方圖的功能,某些情況下(如資料分佈不均)僅更新統計資料不一定能得到準確的執行計劃,只能透過index hint的方式指定索引。新版8.0會增加直方圖功能,讓我們期待MySQL越來越強大的功能吧!

相關推薦:

實例解析:統計資訊管理、Spring註解開發與EasyUI

收集SQL Server統計資料_PHP教學課程

以上是MySQL統計資訊的詳細概述的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1224
24
MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他數據庫:比較選項 MySQL與其他數據庫:比較選項 Apr 15, 2025 am 12:08 AM

MySQL適合Web應用和內容管理系統,因其開源、高性能和易用性而受歡迎。 1)與PostgreSQL相比,MySQL在簡單查詢和高並發讀操作上表現更好。 2)相較Oracle,MySQL因開源和低成本更受中小企業青睞。 3)對比MicrosoftSQLServer,MySQL更適合跨平台應用。 4)與MongoDB不同,MySQL更適用於結構化數據和事務處理。

See all articles