Mysql优化

数据库如何进行优化

  数据库设计规范(三大范式)
  添加索引(普通索引,唯一索引,全文索引等等)
  分库分表(垂直分割和水平分割)
  读写分离
  存储过程
  配置MySQL连接参数
  SQL语句优化
  清理碎片化
  mysql服务器优化

数据库设计规范(三大范式)

 

  第一范式:保证每一个列的原子性,不可再分
  第二范式: 在满足第一范式基础之上,保证表中数据的唯一,每一个列都和主键相关,一张表只描述一件事情
  第三范式:在满足第二范式基础之上,保证表中每一个列都和主键直接相关,而不是间接相关
  在实际开发场景当中,根据业务需求来定,没有必要非得严格按照三大范式

分库分表:mycat
  什么时候分库:垂直分割,专库专用
  分布式项目,每一个模块是一个工程,进行分库,一个数据库对应一个模块
  优点
    拆分之后业务更加清晰,拆分规则更加明确
    系统之间整合或者扩展更加方便
    数据维护简单
  缺点
    如果遇到关联,维护起来比较麻烦
    受各种业务限制
  什么时候分表:单张表数据量过大的情况下,进行水平分割,(取模算法)
  优点
    每一张表不存在大量的数据
    对应用透明
    按照合理的查新规则进行拆分,避免夸库
    提高了系统的负载能力
  缺点
    拆分规则不好确定
    对事务一致性难以解决
    分页不好做

定位慢查询

CREATE TABLE user0(
id INT UNSIGNED PRIMARY KEY ,
NAME VARCHAR(32) NOT NULL DEFAULT '',
pwd  VARCHAR(32) NOT NULL DEFAULT '')
ENGINE=MYISAM CHARSET utf8;

CREATE TABLE user1(
id INT UNSIGNED PRIMARY KEY ,
NAME VARCHAR(32) NOT NULL DEFAULT '',
pwd  VARCHAR(32) NOT NULL DEFAULT '')
ENGINE=MYISAM CHARSET utf8;

CREATE TABLE user2(
id INT UNSIGNED PRIMARY KEY ,
NAME VARCHAR(32) NOT NULL DEFAULT '',
pwd  VARCHAR(32) NOT NULL DEFAULT '')
ENGINE=MYISAM CHARSET utf8;
CREATE TABLE UUID(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT)ENGINE=MYISAM CHARSET utf8;







SHOW VARIABLES LIKE 'long_query_time';


SHOW STATUS LIKE 'slow_queries';


SET long_query_time=1


/*部门表*/
CREATE TABLE dept( 
deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0,  /*编号*/
dname VARCHAR(20)  NOT NULL  DEFAULT "", /*名称*/
loc VARCHAR(13) NOT NULL DEFAULT "" /*地点*/
) ENGINE=MYISAM DEFAULT CHARSET=utf8 ;
/*员工表*/
CREATE TABLE emp
(empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2)  NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
)ENGINE=MYISAM DEFAULT CHARSET=utf8 ;




/*薪水*/
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2)  NOT NULL,
hisal DECIMAL(17,2)  NOT NULL
)ENGINE=MYISAM DEFAULT CHARSET=utf8;



DELIMITER $$
CREATE FUNCTION rand_string(n INT) 
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN 
#chars_str定义一个变量 chars_str,类型是 varchar(100),默认值'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
 DECLARE chars_str VARCHAR(100) DEFAULT
   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
 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 $$




DELIMITER $$
CREATE FUNCTION rand_num()
RETURNS INT(5)
BEGIN
 DECLARE i INT DEFAULT 0;
 SET i =FLOOR(10+RAND()*500);
 RETURN i;
END $$


DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0; 
#set autocommit =0 把autocommit设置成0
 SET autocommit = 0;  
 REPEAT
 SET i = i + 1;
 INSERT INTO emp VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
 UNTIL i = max_num
 END REPEAT;
   COMMIT;
END $$

CALL insert_emp (101002,40000000);  

SELECT * FROM emp

 

posted @ 2020-02-19 16:52  梅川酷子灬  阅读(151)  评论(0编辑  收藏  举报