-- 按照gift_type分组再按礼物数量降序 SELECT * FROM ( SELECT*, ( dense_rank () over ( PARTITIONBY gift_type ORDERBY gift_quantity DESC ) ) AS sort FROM gift_order ) AS m WHERE sort <=3
DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 2 MONTH);
优化后:
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 定义存储过程 CREATE PROCEDURE DeleteData() BEGIN DECLARE rows_affected INT DEFAULT 1; -- 初始化为一个大于0的值以进入循环
WHILE rows_affected > 0 DO delete FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 2 MONTH) limit 1000; SET rows_affected = ROW_COUNT(); -- 获取受影响的行数 END WHILE; END
-- 定义存储过程 CREATE PROCEDURE batchUpdate() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE current_pid INT; DECLARE batch_size INT DEFAULT 100; DECLARE offset INT DEFAULT 0; DECLARE total_rows INT; DECLARE cur CURSOR FOR SELECT id FROM `user` WHERE age > 200 LIMIT batch_size OFFSET offset; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 获取总行数 SELECT COUNT(*) INTO total_rows FROM `user` WHERE age > 200; WHILE offset < total_rows DO OPEN cur; read_loop: LOOP FETCH cur INTO current_pid; IF done THEN LEAVE read_loop; END IF; -- 执行更新操作 UPDATE `user` SET `name` = CONCAT(`name`,"-01") WHERE id = current_pid; END LOOP; CLOSE cur; COMMIT; -- 提交当前批次的更新操作 SET offset = offset + batch_size; SET done = FALSE; -- 重置 done 标志 END WHILE; END
-- 调用存储过程 CALL batchUpdate()
六、查询各表的占用情况
1 2 3 4 5 6 7 8 9
SELECT table_name , round(table_rows, 0) AS 'Rows', round(data_length / 1024 / 1024, 2) AS 'Data MB', round(index_length / 1024 / 1024, 2) AS 'Index MB', round((data_length + index_length) / 1024 / 1024, 2) AS 'Total MB', round(data_free / 1024 / 1024, 2) AS 'Free MB' FROM information_schema.tables WHERE table_schema = 'dj_put' ;