我就想加个索引,怎么就这么难?
❝
领导让我SQL优化,我直接把服务干挂了…
❞
前言
MySQL大表加字段或者加索引,是有一定风险的。
大公司一般有DBA,会帮助开发解决这个痛点,可是DBA是怎么做的呢?
小公司没有DBA,作为开发我们的责任就更大了。那么我们怎么才能安全的加个索引呢?
今天,我们通过模拟案例以及原理分析,去弄清楚MySQL中DDL的风险,以及如何避免事故发生。
准备
软件以及项目
安装本地版本MySQL。
一个简单的增删改查项目。
使用JMeter进行并发请求测试。
创建表
如果存在user表则删除
DROP TABLE IF EXISTS user;
创建user表
CREATE TABLE user
(
id
bigint NOT NULL AUTO_INCREMENT COMMENT ‘自增主键’,
name
varchar(10) DEFAULT NULL COMMENT ‘姓名’,
age
int(2) DEFAULT NULL COMMENT ‘年龄’,
address
varchar(30) DEFAULT NULL COMMENT ‘地址’,
description
varchar(100) DEFAULT NULL COMMENT ‘描述’,
test_id
bigint DEFAULT NULL COMMENT ‘测试 id’,
create_time
timestamp NULL DEFAULT NULL COMMENT ‘创建时间’,
modify_time
timestamp NULL DEFAULT NULL COMMENT ‘修改时间’,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘mysql ddl测试表’;
创建存储过程
如果存在test存储过程则删除
DROP PROCEDURE IF EXISTS test
;
创建无参存储过程,名称为test
CREATE PROCEDURE test()
BEGIN
# 声明变量
DECLARE i INT;
# 变量赋值
SET i = 0;
# 结束循环的条件: 当i等于100万时跳出while循环
WHILE i < 1000000 DO
# 往t_test表添加数据
INSERT INTO test
.user (name
, age
, address
,
description
, test_id
, create_time
, modify_time
)
VALUES (‘iisheng’, 26, ‘北京’, ‘如逆水行舟’, LAST_INSERT_ID() + 1,
‘2020-05-17 16:01:44’, ‘2020-05