MySQL中實(shí)用且高頻的SQL工具與腳本分享
一、實(shí)用且高頻的 SQL 工具腳本
以下是一些實(shí)用且高頻的 SQL 工具腳本代碼示例,涵蓋數(shù)據(jù)庫維護(hù)、性能優(yōu)化、數(shù)據(jù)操作等場(chǎng)景,適用于 MySQL、PostgreSQL 等主流數(shù)據(jù)庫:
1. 數(shù)據(jù)庫維護(hù)類
1.1 數(shù)據(jù)庫備份與恢復(fù)
-- MySQL 備份單表(導(dǎo)出結(jié)構(gòu)和數(shù)據(jù)) mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 表名 > backup_table.sql -- PostgreSQL 備份整個(gè)數(shù)據(jù)庫 pg_dump -U 用戶名 -d 數(shù)據(jù)庫名 > backup_db.sql -- 恢復(fù)備份(通用) mysql -u 用戶名 -p 數(shù)據(jù)庫名 < backup.sql psql -U 用戶名 -d 數(shù)據(jù)庫名 -f backup.sql
1.2 批量生成表結(jié)構(gòu)文檔
-- MySQL 查詢所有表結(jié)構(gòu)
SELECT
TABLE_NAME AS 表名,
COLUMN_NAME AS 字段名,
DATA_TYPE AS 數(shù)據(jù)類型,
COLUMN_COMMENT AS 描述
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = '數(shù)據(jù)庫名';
2. 性能優(yōu)化類
2.1 索引分析與優(yōu)化
-- MySQL 查看未使用索引的表
SELECT
object_schema, object_name, index_name
FROM
performance_schema.table_io_waits_summary_by_index_usage
WHERE
index_name IS NOT NULL
AND count_star = 0;
-- PostgreSQL 查找缺失索引
SELECT
relname AS 表名,
seq_scan - idx_scan AS 全表掃描次數(shù)差,
CASE
WHEN seq_scan - idx_scan > 0 THEN '建議添加索引'
ELSE '無需優(yōu)化'
END AS 建議
FROM
pg_stat_all_tables
WHERE
schemaname = 'public';
2.2 檢測(cè)長(zhǎng)時(shí)間運(yùn)行的查詢
-- MySQL 查看正在執(zhí)行的慢查詢
SHOW FULL PROCESSLIST;
-- 或通過慢查詢?nèi)罩痉治觯ㄐ杼崆伴_啟配置)
-- PostgreSQL 監(jiān)控活躍查詢
SELECT
pid, query, now() - query_start AS 執(zhí)行時(shí)長(zhǎng)
FROM
pg_stat_activity
WHERE
state = 'active'
AND query NOT LIKE '%pg_stat_activity%';
3. 數(shù)據(jù)操作類
3.1 批量插入/更新
-- 批量插入(MySQL/PostgreSQL通用)
INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 28);
-- 批量更新(MySQL)
UPDATE users
SET status = CASE id
WHEN 1 THEN 'active'
WHEN 2 THEN 'inactive'
END
WHERE id IN (1, 2);
-- 批量更新(PostgreSQL)
UPDATE users AS u
SET status = tmp.status
FROM (VALUES
(1, 'active'),
(2, 'inactive')
) AS tmp(id, status)
WHERE u.id = tmp.id;
3.2 數(shù)據(jù)去重
-- 通用:刪除重復(fù)記錄(保留id最大的一條)
DELETE FROM orders
WHERE id NOT IN (
SELECT MAX(id)
FROM orders
GROUP BY order_no
);
3.3 分頁查詢優(yōu)化
-- MySQL(LIMIT-OFFSET)
SELECT * FROM products
ORDER BY id
LIMIT 10 OFFSET 20; -- 第3頁,每頁10條
-- PostgreSQL(窗口函數(shù)高效分頁)
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_num
FROM products
) AS tmp
WHERE row_num BETWEEN 21 AND 30;
4. 監(jiān)控與安全類
4.1 用戶權(quán)限檢查
-- MySQL 查看用戶權(quán)限 SHOW GRANTS FOR '用戶名'@'主機(jī)'; -- PostgreSQL 列出所有用戶角色 SELECT rolname, rolcreaterole, rolsuper FROM pg_roles;
4.2 表空間監(jiān)控
-- MySQL 查看表大小
SELECT
TABLE_NAME AS 表名,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS 大小(MB)
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = '數(shù)據(jù)庫名'
ORDER BY
(DATA_LENGTH + INDEX_LENGTH) DESC;
-- PostgreSQL 查看數(shù)據(jù)庫大小
SELECT
pg_size_pretty(pg_database_size('數(shù)據(jù)庫名')) AS 大小;
5. 動(dòng)態(tài) SQL 與數(shù)據(jù)清洗
5.1 動(dòng)態(tài)生成條件查詢
-- 示例:根據(jù)參數(shù)動(dòng)態(tài)篩選(偽代碼邏輯)
SET @sql = CONCAT('
SELECT * FROM orders
WHERE 1=1
', IF(region IS NOT NULL, ' AND region = ?', ''),
' ORDER BY create_time DESC'
);
PREPARE stmt FROM @sql;
EXECUTE stmt USING region_value;
5.2 數(shù)據(jù)清洗(拆分字段)
-- MySQL 拆分逗號(hào)分隔的字符串
SELECT
id,
SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ',', n), ',', -1) AS tag
FROM
products
CROSS JOIN
(SELECT 1 AS n UNION SELECT 2 UNION SELECT 3) numbers
WHERE
n <= LENGTH(tags) - LENGTH(REPLACE(tags, ',', '')) + 1;
-- PostgreSQL 使用 regexp_split_to_table
SELECT
id,
regexp_split_to_table(tags, ',') AS tag
FROM
products;
注意事項(xiàng)
- 數(shù)據(jù)庫差異:部分語法需根據(jù) MySQL、PostgreSQL 等調(diào)整(如分頁、字符串函數(shù))。
- 權(quán)限控制:部分操作需要管理員權(quán)限(如
pg_stat_activity查詢)。 - 生產(chǎn)環(huán)境:慎用 DELETE/UPDATE,操作前先備份數(shù)據(jù)(如
CREATE TABLE backup AS SELECT * FROM table)。
二、實(shí)用且高頻的 SQL 腳本工具
以下是一些實(shí)用且高頻的SQL腳本工具推薦,涵蓋性能優(yōu)化、審計(jì)、分析等場(chǎng)景,結(jié)合功能特點(diǎn)與適用場(chǎng)景進(jìn)行說明:
1. MySQLTuner.pl
功能:MySQL性能診斷工具,分析參數(shù)配置、存儲(chǔ)引擎、日志文件等,提供優(yōu)化建議。
適用場(chǎng)景:快速定位MySQL內(nèi)存、連接數(shù)、緩存等配置問題。
特點(diǎn):
支持MySQL/MariaDB/Percona Server,覆蓋約300項(xiàng)指標(biāo)。
報(bào)告標(biāo)記關(guān)鍵問題(如[!!]),并給出“Recommendations”優(yōu)化建議。
使用示例:
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl ./mysqltuner.pl --socket /var/lib/mysql/mysql.sock
2. pt-query-digest
功能:Percona Toolkit中的慢查詢?nèi)罩痉治龉ぞ撸稍敿?xì)報(bào)告。
適用場(chǎng)景:分析MySQL慢查詢,識(shí)別高負(fù)載SQL語句。
特點(diǎn):
支持從日志、進(jìn)程列表或TCP抓包分析查詢。
提供執(zhí)行時(shí)間分布、TOP SQL排名等統(tǒng)計(jì)信息。
使用示例:
pt-query-digest /var/lib/mysql/slow.log > slow_report.log # 分析指定時(shí)間范圍 pt-query-digest --since '2025-04-28 00:00:00' --until '2025-04-29 00:00:00' slow.log
3. Yearning
功能:SQL審計(jì)平臺(tái),規(guī)范工單提交與執(zhí)行流程。
適用場(chǎng)景:團(tuán)隊(duì)協(xié)作中避免誤操作,記錄SQL執(zhí)行歷史。
特點(diǎn):
支持工單審核、權(quán)限控制、自動(dòng)生成回滾語句。
提供可視化界面,兼容99%的MySQL語法。
部署:
支持自定義審核流程,適合中小團(tuán)隊(duì)使用。
4. QweryBuilder
功能:多數(shù)據(jù)庫腳本管理工具,支持跨平臺(tái)操作。
適用場(chǎng)景:管理多種數(shù)據(jù)庫(如SQL Server、Oracle、MySQL)的腳本與架構(gòu)。
特點(diǎn):
提供差異對(duì)比、自動(dòng)格式化、數(shù)據(jù)庫搜索等功能。
集成WinMerge進(jìn)行對(duì)象差異分析,支持自定義代碼片段。
適用性:適合需統(tǒng)一管理異構(gòu)數(shù)據(jù)庫的環(huán)境。
5. Percona Toolkit(含pt-variable-advisor)
功能:MySQL參數(shù)分析與優(yōu)化建議。
適用場(chǎng)景:檢查變量配置合理性(如緩沖池大小、線程配置)。
特點(diǎn):
識(shí)別潛在問題并標(biāo)記為WARN,如不合理的超時(shí)設(shè)置。
使用示例:
pt-variable-advisor localhost --socket /var/lib/mysql/mysql.sock
6. tuning-primer.sh
功能:MySQL性能調(diào)優(yōu)腳本,提供針對(duì)性建議。
適用場(chǎng)景:快速獲取內(nèi)存、查詢緩存等優(yōu)化建議。
特點(diǎn):
輸出紅色警告提示關(guān)鍵問題,如未優(yōu)化的查詢緩存配置。
使用示例:
wget https://launchpad.net/mysql-tuning-primer/trunk/1.6-r1/+download/tuning-primer.sh ./tuning-primer.sh
總結(jié)
- 性能優(yōu)化:優(yōu)先使用
MySQLTuner.pl和pt-query-digest快速定位問題。 - 團(tuán)隊(duì)協(xié)作:采用
Yearning規(guī)范SQL執(zhí)行流程,避免生產(chǎn)事故。 - 多數(shù)據(jù)庫管理:
QweryBuilder適合異構(gòu)環(huán)境腳本統(tǒng)一管理。
到此這篇關(guān)于MySQL中實(shí)用且高頻的SQL工具與腳本分享的文章就介紹到這了,更多相關(guān)SQL實(shí)用腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL主從狀態(tài)檢查的實(shí)現(xiàn)
這篇文章主要介紹了MySQL主從狀態(tài)檢查的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
MySQL服務(wù)器權(quán)限與對(duì)象權(quán)限詳解
這篇文章主要介紹了MySQL服務(wù)器權(quán)限與對(duì)象權(quán)限,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
MySql Group By對(duì)多個(gè)字段進(jìn)行分組的實(shí)現(xiàn)方法
這篇文章主要介紹了MySql Group By對(duì)多個(gè)字段進(jìn)行分組的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-09-09
mysql之create index和alter add index用法及說明
本文詳細(xì)介紹了MySQL創(chuàng)建索引的三種方法,包括直接創(chuàng)建索引和使用ALTER TABLE添加索引,并對(duì)比了兩種方法的優(yōu)缺點(diǎn),建議在創(chuàng)建索引時(shí)優(yōu)先使用ALTER TABLE以提高效率2026-06-06
Mysql LONGTEXT 類型存儲(chǔ)大文件(二進(jìn)制也可以) (修改+調(diào)試+整理)
MySql2.cpp : Defines the entry point for the console application.2009-07-07
MySQL插入時(shí)間戳字段的值實(shí)現(xiàn)
在MySQL中,我們經(jīng)常會(huì)遇到需要插入時(shí)間戳字段的情況,包括使用NOW()函數(shù)插入當(dāng)前時(shí)間戳,使用FROM_UNIXTIME()插入指定時(shí)間戳,本文就來介紹一下,感興趣的可以了解一下2024-09-09

