mysql
🔍 查询优化类
复制表结构(不含数据)
CREATE TABLE new_table LIKE old_table;复制表结构 + 数据
CREATE TABLE backup_table AS
SELECT * FROM original_table;计算两个日期之间的天数
SELECT DATEDIFF('2025-12-31', '2025-01-01') AS days_diff;查询某字段的平均值、最大值、最小值
SELECT
AVG(price) AS avg_price,
MAX(price) AS max_price,
MIN(price) AS min_price,
COUNT(*) AS total
FROM products;删除重复数据,保留每个 (name, type) 中 id 最大的一条(即最新的)
DELETE t1 FROM your_table_name t1
INNER JOIN your_table_name t2
WHERE
t1.name = t2.name
AND t1.type = t2.type
AND t1.id < t2.id;查找完全重复的整行数据
-- 查找哪些 email 出现了超过一次
SELECT email, COUNT(*) AS count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;快速修改大表结构
-- 添加列(在线操作,不影响业务)
ALTER TABLE large_table
ADD COLUMN new_column INT DEFAULT 0,
ALGORITHM=INPLACE, LOCK=NONE;死锁排查
-- 查看最近死锁信息
SHOW ENGINE INNODB STATUS;监控长事务
-- 查看运行时间超过60秒的事务
SELECT * FROM information_schema.innodb_trx
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;查找完全重复的整行数据
-- 查找哪些 email 出现了超过一次
SELECT email, COUNT(*) AS count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;🛠️ 数据维护类
备份表
-- 1.创建空表结构
CREATE TABLE tab_name_2025 LIKE tab_name;
-- 2.插入数据
INSERT INTO tab_name_2025
SELECT * FROM tab_name;
-- 3.清空表数据并重置自增主键
TRUNCATE TABLE tab_name;
-- 4.复制部分数据到新表
INSERT INTO tab_name_2025 SELECT * FROM tab_name_2025 where genre ='';查询最近 7 天的数据
SELECT * FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);按天/月统计数据量
-- 按天统计
SELECT DATE(created_at) AS day, COUNT(*) AS count
FROM orders
GROUP BY day
ORDER BY day;
-- 按月统计
SELECT DATE_FORMAT(created_at, '%Y-%m') AS month, COUNT(*) AS count
FROM orders
GROUP BY month;快速清空大表(比 DELETE 快)
TRUNCATE TABLE large_table;📊 数据分析类
表空间分析
-- 查看各表占用空间
SELECT
table_name,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'your_database'
ORDER BY (data_length + index_length) DESC;连接数监控
-- 查看当前连接数和使用情况
SHOW PROCESSLIST;📝 实用小技巧
随机抽取数据
-- 随机抽取10条记录
SELECT * FROM users ORDER BY RAND() LIMIT 10;随机抽取数据
-- 随机抽取10条记录
SELECT * FROM users ORDER BY RAND() LIMIT 10;随机抽取数据
-- 随机抽取10条记录
SELECT * FROM users ORDER BY RAND() LIMIT 10;随机抽取数据
-- 随机抽取10条记录
SELECT * FROM users ORDER BY RAND() LIMIT 10;