MYSQL DELETE 语句性能简单评测

内容分享1个月前发布
0 0 0

项目中,我们常常会发现有些表的数据量增长过快,SQL 扫描的时候,需扫许多无效的数据,导致SQL 慢了下来。有些数据业务上

并不是超级的重大,或者具有时效性,如果使用DELETE 将其删除,那么是否能优化性能呢?

创建测试表



CREATE TABLE `user` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL DEFAULT    COMMENT  姓名 ,
 `age` tinyint(4) NOT NULL DEFAULT  0  COMMENT  age ,
 `gender` char(1) NOT NULL DEFAULT  M  COMMENT  性别 ,
 `phone` varchar(16) NOT NULL DEFAULT    COMMENT  手机号 ,
 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT  创建时间 ,
 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT  修改时间 ,
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`),
 KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT= 用户信息表 ;
插入 100w 的数据

DELIMITER $$
DROP PROCEDURE IF EXISTS insert_user_data$$
CREATE PROCEDURE insert_user_data(num INTEGER)
BEGIN
DECLARE v_i int unsigned DEFAULT 0;
SET autocommit= 0;
WHILE v_i < num DO
insert into user(`name`, age, gender, phone) values (CONCAT( lyn ,v_i), mod(v_i,120),  M , CONCAT( 152 ,ROUND(RAND(1)*100000000)));
SET v_i = v_i+1;
END WHILE;
COMMIT;
END $$
DELIMITER ;

call insert_user_data(1000000);

查询性能

select id, age ,phone from user where name like  lyn12% ;
-- 取10次查询样本响应时间平均值
-- 20.1ms
-- 18.5ms
-- 16.6ms
-- 16.7ms
-- 20.8ms
-- 14.9ms
-- 14.4ms
-- 13.8ms
-- 17.5ms
-- 15.3ms

— 均值:15.19 ms
删除 50w数据,再进行查询


delete from user limit 500000;
select id, age ,phone from user where name like  lyn12% ;
-- 取10次查询样本响应时间平均值
-- 44.3ms
-- 30.0ms
-- 27.9ms
-- 27.2ms
-- 32.9ms
-- 39.7ms
-- 31.2ms
-- 28.7ms
-- 38.2ms
-- 38.8ms

— 均值:30.07ms

mysql delete 操作并不会直接把数据删除,而且会增加碎片率。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...