MySQL?的ANALYZE與?OPTIMIZE命令(最佳實(shí)踐指南)
MySQL 的ANALYZE與 OPTIMIZE命令
一、ANALYZE TABLE - 更新統(tǒng)計(jì)信息
1. 基本語(yǔ)法與功能
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE
tbl_name [, tbl_name] ...作用:收集表統(tǒng)計(jì)信息用于優(yōu)化器生成更優(yōu)的執(zhí)行計(jì)劃,主要更新:
- 索引基數(shù)(cardinality)
- 數(shù)據(jù)分布直方圖(MySQL 8.0+)
- 表的存儲(chǔ)引擎統(tǒng)計(jì)信息
2. 使用場(chǎng)景
-- 單表分析 ANALYZE TABLE customers; -- 多表分析(適用于批量維護(hù)) ANALYZE TABLE orders, order_items; -- 不寫入二進(jìn)制日志(主從復(fù)制環(huán)境) ANALYZE NO_WRITE_TO_BINLOG TABLE large_table;
3. 執(zhí)行效果驗(yàn)證
-- 查看索引統(tǒng)計(jì)信息 SHOW INDEX FROM customers; -- 查看直方圖信息(MySQL 8.0+) SELECT * FROM information_schema.column_statistics WHERE table_name = 'customers';
4. 自動(dòng)分析配置
-- 查看自動(dòng)分析設(shè)置 SHOW VARIABLES LIKE 'innodb_stats_auto_recalc'; -- 設(shè)置自動(dòng)分析閾值(默認(rèn)10%變化觸發(fā)) SET GLOBAL innodb_stats_persistent_sample_pages = 200; ALTER TABLE customers STATS_SAMPLE_PAGES = 500;
二、OPTIMIZE TABLE - 表優(yōu)化重組
1. 基本語(yǔ)法與功能
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE
tbl_name [, tbl_name] ...作用(根據(jù)存儲(chǔ)引擎不同):
- InnoDB:重建表,整理碎片(實(shí)際是ALTER TABLE的包裝)
- MyISAM:修復(fù)碎片、排序索引、更新統(tǒng)計(jì)
- ARCHIVE:重新壓縮表數(shù)據(jù)
2. 使用場(chǎng)景
-- 單表優(yōu)化
OPTIMIZE TABLE order_archive;
-- 批量?jī)?yōu)化所有表
SELECT CONCAT('OPTIMIZE TABLE ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'mydb'
AND engine = 'InnoDB'
INTO OUTFILE '/tmp/optimize_tables.sql';
SOURCE /tmp/optimize_tables.sql;3. 執(zhí)行效果驗(yàn)證
-- 查看表碎片率(InnoDB)
SELECT table_name,
data_free / (data_length + index_length) AS frag_ratio
FROM information_schema.tables
WHERE table_schema = 'mydb'
AND data_length > 0;
-- 優(yōu)化前后性能對(duì)比
EXPLAIN ANALYZE SELECT * FROM large_table WHERE create_time > '2023-01-01';4. 替代方案(避免鎖表)
-- 使用pt-online-schema-change工具(Percona Toolkit) pt-online-schema-change --alter="ENGINE=InnoDB" D=mydb,t=large_table -- 使用gh-ost工具(GitHub) gh-ost --alter="ENGINE=InnoDB" --database=mydb --table=large_table
三、核心區(qū)別對(duì)比
| 特性 | ANALYZE TABLE | OPTIMIZE TABLE |
|---|---|---|
| 主要目的 | 更新統(tǒng)計(jì)信息 | 物理重組表結(jié)構(gòu) |
| 鎖級(jí)別 | 通常僅讀鎖 | 表鎖(InnoDB為MDL鎖) |
| 執(zhí)行時(shí)間 | 通常較快 | 大表可能很慢 |
| 存儲(chǔ)引擎影響 | 所有引擎都需要 | 不同引擎效果不同 |
| 空間回收 | 不會(huì)回收空間 | 可能回收空間 |
| 自動(dòng)觸發(fā)機(jī)制 | 有(innodb_stats_auto_recalc) | 無(wú) |
四、最佳實(shí)踐指南
1. 維護(hù)計(jì)劃建議
-- 每周維護(hù)腳本示例
SET @db = 'mydb';
SET @threshold = 0.3; -- 碎片率閾值
SELECT CONCAT('ANALYZE TABLE ', table_name, ';') AS analyze_cmd
FROM information_schema.tables
WHERE table_schema = @db
AND engine = 'InnoDB';
SELECT CONCAT('OPTIMIZE TABLE ', table_name, ';') AS optimize_cmd
FROM (
SELECT table_name,
data_free / (data_length + index_length) AS frag_ratio
FROM information_schema.tables
WHERE table_schema = @db
AND engine = 'InnoDB'
AND data_length > 0
) t WHERE frag_ratio > @threshold;2. 生產(chǎn)環(huán)境注意事項(xiàng)
- 避開(kāi)高峰期:在低負(fù)載時(shí)段執(zhí)行OPTIMIZE
- 備份優(yōu)先:執(zhí)行前確保有有效備份
- 監(jiān)控進(jìn)度:
watch -n 1 "mysql -e 'SHOW PROCESSLIST' | grep -i optimize"
- 考慮替代方案:
-- InnoDB碎片整理替代方案 ALTER TABLE large_table ENGINE=InnoDB; -- 使用Percona的pt-index-usage分析索引 pt-index-usage /var/lib/mysql/mysql-slow.log
3. 性能監(jiān)控指標(biāo)
-- 查詢效率變化監(jiān)控
SELECT * FROM sys.schema_table_statistics
WHERE table_schema = 'mydb';
-- 碎片率監(jiān)控視圖
CREATE VIEW frag_monitor AS
SELECT table_schema, table_name,
ROUND(data_free/(1024*1024),2) AS frag_mb,
ROUND(data_free/(data_length+index_length)*100,2) AS frag_pct
FROM information_schema.tables
WHERE data_length > 0
ORDER BY frag_mb DESC;五、常見(jiàn)問(wèn)題解決方案
1. 長(zhǎng)時(shí)間阻塞問(wèn)題
-- 查看阻塞會(huì)話 SELECT * FROM performance_schema.threads WHERE PROCESSLIST_COMMAND = 'Query' AND PROCESSLIST_STATE LIKE '%optimize%'; -- 安全終止優(yōu)化操作 KILL [process_id];
2. 空間不足問(wèn)題
# 檢查磁盤空間 df -h /var/lib/mysql # 臨時(shí)更改tmpdir(需要重啟) [mysqld] tmpdir = /mnt/bigtmp
3. 復(fù)制環(huán)境處理
-- 從庫(kù)延遲監(jiān)控 SHOW SLAVE STATUS\G -- 使用NO_WRITE_TO_BINLOG OPTIMIZE NO_WRITE_TO_BINLOG TABLE audit_log;
4. 大表優(yōu)化策略
# 分塊優(yōu)化(使用pt-archiver) pt-archiver --source h=localhost,D=mydb,t=large_table \ --purge --where "1=1" --limit 1000 --commit-each
通過(guò)合理使用ANALYZE TABLE和OPTIMIZE TABLE,可以保持MySQL數(shù)據(jù)庫(kù)性能穩(wěn)定。對(duì)于關(guān)鍵業(yè)務(wù)表,建議建立定期的統(tǒng)計(jì)信息收集和碎片整理計(jì)劃,同時(shí)結(jié)合現(xiàn)代監(jiān)控工具持續(xù)跟蹤表健康狀況。
到此這篇關(guān)于MySQL 的ANALYZE與 OPTIMIZE命令的文章就介紹到這了,更多相關(guān)mysql analyze和optimize命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql下優(yōu)化表和修復(fù)表命令使用說(shuō)明(REPAIR TABLE和OPTIMIZE TABLE)
- Mysql?optimize?table?時(shí)報(bào)錯(cuò):Temporary?file?write?fail的解決
- MySQL實(shí)現(xiàn)批量檢查表并進(jìn)行repair與optimize的方法
- 實(shí)現(xiàn)MySQL定時(shí)批量檢查表repair和優(yōu)化表optimize table的shell腳本
- 探討Mysql中OPTIMIZE TABLE的作用詳解
- IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安裝配置圖文教程 2009年
- IIS php環(huán)境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安裝與配置
相關(guān)文章
MySQL8.4設(shè)置密碼規(guī)則為mysql_native_password問(wèn)題
這篇文章主要介紹了MySQL8.4設(shè)置密碼規(guī)則為mysql_native_password問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Navicat for MySQL 15注冊(cè)激活詳細(xì)教程
這篇文章主要介紹了Navicat for MySQL 15注冊(cè)激活詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
解決MySQL 5.7.9版本sql_mode=only_full_group_by問(wèn)題
這篇文章主要介紹了解決MySQL 5.7.9版本sql_mode=only_full_group_by問(wèn)題,需要的朋友可以參考下2017-05-05
Mysql?InnoDB引擎中頁(yè)目錄和槽的查找過(guò)程
這篇文章主要為大家介紹了Mysql?InnoDB引擎中頁(yè)目錄和槽的查找記錄過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
借助PHP的mysql_query()函數(shù)來(lái)創(chuàng)建MySQL數(shù)據(jù)庫(kù)的教程
這篇文章主要介紹了借助PHP的mysql_query()函數(shù)來(lái)創(chuàng)建MySQL數(shù)據(jù)庫(kù)的教程,將函數(shù)配合CREATE DATABASE語(yǔ)句使用,需要的朋友可以參考下2015-12-12
使用mysql記錄從url返回的http GET請(qǐng)求數(shù)據(jù)操作
這篇文章主要介紹了使用mysql記錄從url返回的http GET請(qǐng)求數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
CentOS 7搭建多實(shí)例MySQL8的詳細(xì)教程(想要幾個(gè)搞幾個(gè))
這篇文章主要介紹了CentOS 7搭建多實(shí)例MySQL8的詳細(xì)教程(想要幾個(gè)搞幾個(gè)),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
mysql5.7.19 解壓版安裝教程詳解(附送純凈破解中文版SQLYog)
Mysql5.7.19版本是今年新推出的版本,最近幾個(gè)版本的MySQL都不再是安裝版,都是解壓版了,大家在使用過(guò)程中遇到很多問(wèn)題,下面小編給大家?guī)?lái)了MySQL5.7.19 解壓版安裝教程詳解,感興趣的朋友一起看看吧2017-10-10

