数据库调优教程(二)慢查询数据准备

一、           发现慢查询

上一讲我们谈论了慢查询的定义,这一讲我们来创建一张大表,为慢查询做数据准备。

2.      慢查询数据准备

要想发现慢查询,首先要使慢查询发生。在一张普通数量级的表格中是不能发生慢查询的,除非你对于慢查询的定义时一个毫秒。因此我们必须手动创建一张大数量级的表,这里选择创建一张40万数量级的表(同学们也可以创建百万级的,如果你们的电脑很厉害。但是一般情况下,十万级的数据就可以看出慢查询了)。

1)    创建数据库

[plain] view
plain
copy

  1. Create database bigTable default character set GBK;

2)    创建表

#部门表#

[plain] view
plain
copy

  1. CREATE TABLE dept(
  2. id int unsigned primary key auto_increment,
  3. deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0,
  4. dname VARCHAR(20)  NOT NULL  DEFAULT "",
  5. loc VARCHAR(13) NOT NULL DEFAULT ""
  6. ) ENGINE=INNODB DEFAULT CHARSET=GBK ;

#雇员表#

[plain] view
plain
copy

  1. CREATE TABLE emp
  2. (
  3. id int unsigned primary key auto_increment,
  4. empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*编号*/
  5. ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
  6. job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
  7. mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
  8. hiredate DATE NOT NULL,/*入职时间*/
  9. sal DECIMAL(7,2)  NOT NULL,/*薪水*/
  10. comm DECIMAL(7,2) NOT NULL,/*红利*/
  11. deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
  12. )ENGINE=INNODB DEFAULT CHARSET=GBK ;

3)    创建函数

函数用于随机产生数据,保证每条数据都不同

#函数1 创建#

#创建函数. 用于随机产生字符串。该函数接收一个整数

[plain] view
plain
copy

  1. delimiter $$#定义一个新的命令结束符合
  2. create function rand_string(n INT)
  3. returns varchar(255) #该函数会返回一个字符串
  4. begin
  5. #chars_str定义一个变量 chars_str,类型是 varchar(100),默认值‘abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ‘;
  6. declare chars_str varchar(100) default
  7. ‘abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ‘;
  8. declare return_str varchar(255) default ‘‘;
  9. declare i int default 0;
  10. while i < n do
  11. set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));
  12. set i = i + 1;
  13. end while;
  14. return return_str;
  15. end $$

#函数2创建#

#用于随机产生部门编号

[plain] view
plain
copy

  1. create function rand_num( )
  2. returns int(5)
  3. begin
  4. declare i int default 0;
  5. set i = floor(10+rand()*500);
  6. return i;
  7. end $$

4)    创建存储过程

#存储过程一#

#该存储过程用于往emp表中插入大量数据

[plain] view
plain
copy

  1. create procedure insert_emp(in start int(10),in max_num int(10))
  2. begin
  3. declare i int default 0;
  4. #set autocommit =0 把autocommit设置成0
  5. set autocommit = 0;
  6. repeat
  7. set i = i + 1;
  8. insert into emp (empno, ename ,job ,mgr ,hiredate ,sal ,comm ,deptno ) values ((start+i) ,rand_string(6),‘SALESMAN‘,0001,curdate(),2000,400,rand_num());
  9. until i = max_num
  10. end repeat;
  11. commit;
  12. end $$

执行存储过程,往emp表添加40万条数据

[plain] view
plain
copy

  1. call insert_emp(100001,400000);

查询,发现Emp表插入了40万条记录

#存储过程二#

#往dept表添加随机数据

[plain] view
plain
copy

  1. create procedure insert_dept(in start int(10),in max_num int(10))
  2. begin
  3. declare i int default 0;
  4. set autocommit = 0;
  5. repeat
  6. set i = i + 1;
  7. insert into dept (deptno ,dname,loc  ) values ((start+i) ,rand_string(10),rand_string(8));
  8. until i = max_num
  9. end repeat;
  10. commit;
  11. end $$

执行存储过程二

[plain] view
plain
copy

  1. delimiter ;
  2. call insert_dept(100,10);

至此,数据准备完成。我们创建了大表emp。

时间: 2024-10-23 16:44:24

数据库调优教程(二)慢查询数据准备的相关文章

数据库调优教程汇总

前段时间帮公司优化数据库,凭着之前所学,一步一步地将学习知识用于实践,总算是将速度蹭上去了,一个原本要执行1分多钟的查询现在只需要3秒. 这两个星期来把自己所学所思及所用加以总结,发表了关于数据库系列的一系列文章,一方面为自己巩固知识,另一方面也给广大同学以一点点参考. 现将这系列文章进行汇总,方便大家查阅. 本套教程共十三讲. 在这系列的教程中,你将会学到 1.    如何一步步地优化数据库 2.    如何把索引的作用发挥的淋漓尽致 3.    如何解决Mysql在like'%xxx%'模糊

数据库调优教程(十三) MySQL数据库其他优化方法

六.           MySQL数据库其他优化方法 最后一章,谈谈前面没有涉及的一些优化方法. 1.      My.ini配置文件 这里只介绍两个最重要的,其他的不过多介绍. 1)    配置 最大连接数 默认为100,建议设为1000 2)   配置 缓存 在my.ini的[mysqld]节点开启查询缓存,配置如下 query_cache_size = 268435456 query_cache_type = 1 query_cache_limit = 1048576 2.      使

数据库调优教程(一)前言&amp;慢查询定义

前言 最近帮公司优化数据库,凭着之前所学,一步一步地将学习知识用于实践,总算是将速度蹭上去了,一个原本要执行1分多钟的查询现在只需要3秒. 现把自己所学所思及所用加以总结,一方面为自己巩固知识,另一方面也给广大同学以一点点参考. 本套教程共十三讲. 在这系列的教程中,你将会学到 1.     如何一步步地优化数据库 2.     如何把索引的作用发挥的淋漓尽致 3.     如何解决Mysql在like'%xxx%'模糊查询的情况下不使用索引 4.     如何设计一张优质的表 5.     如

数据库调优教程(三)记录慢查询

一.           发现慢查询 上一讲我们为慢查询的发生做了数据准备,这一讲就让我们来发现慢查询,同时把它记录到文件中. 3.      记录慢查询 此时我们已经有让慢查询发生的成本了.执行以下语句,你就知道什么叫慢!查!询! [plain] view plaincopy select empno from emp where ename=''; 一个很明显找不到结果的查询语句居然也执行了近3秒钟. 这时候,作为DBA就应该把这个sql语句记录下来,是记在记事本还是写在笔记本呢?不用想太多

数据库调优教程(十二) 优化sql语句

五.           优化Sql语句 上一章讲了如何设计一张好的表,一张好的表自然需要好的sql语句去操作它.本章就来聊聊如何优化sql语句. 1.      Sql语句优化原则 优化需要优化的Query 定位优化对象性能瓶颈 从Explain入手 尽可能在索引中完成排序 只取自己需要的Column 尽可能避免复杂的join和子查询 2.     优化limit select * from test1 order by id limit 99999,10 原语句虽然使用了id索引,但是相当于

数据库调优教程(四)Explain性能分析命令

上一章我们将了如何发现慢查询并把语句记录到日志中,那么在发现慢查询后,要怎样才能知道语句的问题发生在哪里.本章将介绍怎样使用Mysql提供的数据库性能分析命令,对sql语句进行分析. 二.数据库性能分析Explain命令 Explain的作用是生成一个QEP(查询执行计划),可以帮助我们在不真正执行某个sql语句时,就看到mysql怎样执行,这样方便我们去分析sql指令的好坏. 执行如下语句 [plain] view plaincopy Explain select * from emp whe

数据库调优教程(十一) 设计一张漂亮的表

四.           设计一张漂亮的表 上一章讲了如何通过索引来提速我们的查询语句,这一章让我们回到数据库开发的初始阶段,建表.谈谈怎样设计一张漂亮的表. 1.      满足三范式 1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sqlserver),就自动的满足1NF 数据库的分类 关系型数据库:  mysql/oracle/db2/informix/sysbase/sql

数据库调优教程(七)索引的代价

三.           索引 4.      索引的代价 前面几讲介绍了索引在提高性能方面的威力以及如何使用索引,但是索引也是有开销的 1)    占用磁盘空间 如前面所述,索引是有开销的,表现在添加索引后.ibd文件(innodb引擎)或者.myi文件(myisam引擎)会变大. 2)    导致dml操作速度变慢 添加索引后之所以会快,是因为表依据索引对数据按某种算法(二叉树等)进行排序,所以删除.增加.插入后二叉树要重新排序,导致执行效率降低. 此时要看自己的数据库是dml语句执行的多还

数据库调优教程(十) 【精华章节】解决like ’%str’ 时索引不被使用的4种方法

三.           索引 7.      解决like'%str'不使用模糊查询的4种方法 上一讲最后说了,只要模糊查询的模糊值在字符串前面,则不会使用索引,'%aaa'和'_aaa'都不会! 如下 应该说这是Mysql给程序员们开的一个玩笑.要是我的表数据量很大,而且又需要使用like'%%'这样的模糊查询来检索时,该怎么办?? 接下来,笔者将会给大家分享解决这个问题的四种方法! 1)    Select主键 只要Select的字段刚好是主键,那么就会使用到索引(只对innodb数据库有