下班自行车的路上 脑袋里突然蹦出来一个 面试官老是问 问数据库数据太多怎么优化
死搬硬套:
1.优化查询语句
2.使用索引
3.分区表
4.硬件升级
那么真实的情况到底是怎么样的 想弄着玩玩 亲身体会一下 叫做“纸上得来终觉浅,绝知此事要躬行” 奈斯 说搞就搞
查资料 测试 这里是在csdn上借鉴这篇文章的sql语句 毕竟让我自己写 一时半会也写不出来 就所想之处 玩就是了
MYSQL用存储过程创建百万级测试数据表_www520507的专栏-CSDN博客
1.2.3.4.5.6. 全部复制 分开选中右键数据库中分开执行
(可以尝试一下全部执行)理论上是不应该有问题的 但是我是分开执行的sql的
不足:插入数据太慢 还有教程好像也是存储过程 提高查询速度的 最短50s100万数据插入完成
这个差不多是一个入门级别的 缺点就是插入数据的速度太慢了 就
现在还没好 有点迫不及待想看到百万级别的数据库是什么样子的了
到底呀 到底 强迫症的我想看看执行这个存储过程到底需要多久的时间
差不多23分钟了 我淦
#1.创建随机字符串函数,便于创建名称
DROP function if EXISTS rand_string;
#创建一个指定字符个数的函数
create function rand_string(n INT)
#返回字符串,注意:此处关键字是returns 而不是return
returns varchar(255)
BEGIN
#定义一个临时变量,给变量赋值'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
# 定义返回结果字符串
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i int DEFAULT 0;
WHILE i < n DO
set return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
set i=i+1;
END while;
RETURN return_str;
END
#2.创建随机编号生成函数
drop function if exists rand_num;
CREATE function rand_num()
returns int(5)
BEGIN
DECLARE i int default 0;
set i = FLOOR(10+RAND()*500);
return i;
END
#3.创建数据表 -- 部门表 dept
drop table if EXISTS dept;
create table dept (
deptno MEDIUMINT UNSIGNED not null DEFAULT 0,
dname varchar(20) default '',
ioc varchar(13) default''
) ENGINE = myisam default CHARSET ='utf8';
ALTER table dept add PRIMARY key(deptno);
#4.创建数据表 -- 员工表 emp
drop table if EXISTS emp;
CREATE TABLE `emp` (
`empno` mediumint(8) unsigned NOT NULL DEFAULT '0',
`ename` varchar(20) NOT NULL DEFAULT '',
`job` varchar(9) NOT NULL DEFAULT '',
`mgr` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '上级编号',
`hiredate` date NOT NULL COMMENT '入职日期',
`salary` decimal(7,2) NOT NULL COMMENT '薪水',
`comm` decimal(7,2) NOT NULL COMMENT '红利',
`deptno` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '部门编号'
) ENGINE=MYISAM DEFAULT CHARSET=utf8;
#5.插入测试数据
drop PROCEDURE IF EXISTS insert_emp ;
CREATE PROCEDURE insert_emp (in start_no int(10),in max_num int(10))
BEGIN
DECLARE i int default 0;
# 设置自动提交为false
set autocommit =0;
# 开启循环
REPEAT
set i = i+1;
insert into emp values((start_no+i),rand_string(6),'SALESMAN',0001,CURDATE(),rand_num(),400,0002);
UNTIL i=max_num
END REPEAT;
END
#6.调用存储过程,生成百万数据
call insert_emp(10000,10000000);
干的漂亮
试一下使用条件查询会不会好一点
牛呀牛
今日还有别的事情 欲知后事如何 请听下回分享 2021年11月3日20:20:08