第 1 章Mysql优化概述

网站的瓶颈在web层(web吞吐量),程序对mysql的操作.我们前面讲的页面静态化技术和memcached技术目的减少对mysql访问,但是总是访问数据库,所以我们需要对数据库本身进行优化.在PHP和Java开发中,主要从7个方面优化

①数据库(表)本身设计要规范(至少要求满足3NF) 3范式

②创建适当索引(主键索引,普通索引,唯一索引,全文索引sphinx->coreseek,空间索引)

③优化SQL语句->如何定位慢查询

④使用分表技术[思路:大->小],水平分割,垂直分割

⑤创建适当存储过程,触发器,自定义函数,视图(1,模块化编程,2提高数据库的访问速度)

⑥优化my.ini文件(调整mysql的各级缓存.)

⑦升级mysql硬件和软件 , 操作系统64, mysql就使用64

未完待续...

我们的表要满足1NF基础上,才可以谈满足2NF,目前最高级6NF,对PHP网站说,我们只要满足3NF。

比如mysql, oracle, sql server ,postgresql,informix,DB2

面向对象和集合数据库.

mongodb数据库面向文档

所谓1NF:属性(列)具有原子性,不可在分割,还有就是把同一张表不可以有两个相同列.

所谓2NF:说表的记录具有唯一性.,即不能出现完全相同的两条记录.一般说,通过设置主键即可.

注意;主键最好是非业务逻辑主键,使用自增长.

3NF要保证数据没有冗余.即如果数据可能通过显示或者隐式的推导出,就不要单独设计一列.

比如下图就是满足3NF:

但是说明; 有时我们设计表的时候,可能会使用反3NF.,举例:

上面的相册表的设计就使用到了反3NF,但是他提高了效率

使用 showstatus 可以参考到mysql的各个参数,我们需要掌握的是以下参数, 其它请参考手册.

比如 com_select com_update com_insert com_delete , 比如我们在选择表究竟时候用MyISAM 还是 InnoDB ,可以看看该网站是以读和写操作为主,则可以使用MyISAM.

这里注意当我们使用 showstatus 来查询参数时,默认是当前会话.

show session status like xxxx

如果你要查看从数据库启动到现在状态

show global status like xxx

show status like ‘connections’ 可以查看当前连接的数量.

表示数据库启动时间

show status like ‘slow_queries’

显示慢查询次数, 默认情况下mysql认为慢查询时间是10s

我们使用两个方法,蠕虫复制,可以构建大表,但是测试效果不好.

使用存储过程来创建海量表

模拟一个雇员管理系统

#模拟一个雇员管理系统

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 ;

#创建表EMP雇员

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 NULLDEFAULT 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;

#测试数据

INSERT INTO salgrade VALUES (1,700,1200);

INSERT INTO salgrade VALUES (2,1201,1400);

INSERT INTO salgrade VALUES (3,1401,2000);

INSERT INTO salgrade VALUES (4,2001,3000);

INSERT INTO salgrade VALUES (5,3001,9999);

delimiter $$

#创建一个函数,可以返回一个随机的字符串

create function rand_string(n INT)

returns varchar(255) #该函数会返回一个字符串

begin

#定义了一个变量 chars_str,类型 varchar(100)

#默认给 chars_str 初始值 '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 $$

#这里我们又自定了一个函数,返回一个随机的部门号

create function rand_num( )

returns int(5)

begin

declare i int default 0;

set i = floor(10+rand()*500);

return i;

end $$

#随即添加雇员[光标] 400w,Mysql开发中,可以在存储过程中调用你自己

#编写的函数

create procedure insert_emp(in start int(10),in max_num int(10))

begin

declare i int default 0;

#set autocommit =0 把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 $$

调用存储过程添加400w数据

call insert_emp(100001,4000000);

步骤

①在默认情况下,mysql是不会记录慢查询, 所以我们要使用另外一种方式启动mysql,指令: cmd>bin\mysqld.exe � safe-mode �slow-query-log

这样就会在mysql 的 data目录,生成一个日志文件,该文件可以把慢查询语句记录到文件.

②为了测试我们修改默认的慢查询时间

show variables like ‘long_query_time’ 【查询当前慢查询时间】

set long_query_time=1

③当执行一个时间超过1秒的sql语句,就会被记录下来.

# Query_time: 1.500000 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4000000

use temp100;

SET timestamp=1371870578;

select * from emp whereempno=456784;

④分析慢查询时如何导致explain 工具

基本语法: explain sql \G

可以来分析mysql是如何执行你的sql语句

细致的说明请参考优化.ppt

⑤解决问题: 我们发现目前这个语句没有使用到索引,因此我们先考虑使用索引解决.

创建普通索引: CREATE INDEX 索引名 ON 表名(列)

⑥看看此时速度怎样

图:

①当一个表的存储引擎是MyISAM 时,对应三个文件

表名.frm 【表的结构】

表名.myd 【表的数据】

表名.myi 【索引的数据】

未完待续...

mysql数据库优化韩顺平_韩顺平 Mysql数据库优化(一) 优化概述相关推荐

  1. 如何做优化SEO排名_海南哪个公司可以做_seo优化

    有需要交流的可以加我微信pangna169.原文来之:如何做优化SEO排名_海南哪个公司可以做_seo优化 在一家专业的网络营销公司中,他们的SEO团队需要有着多种不同的专业角色构成,现在的互联网时代 ...

  2. mysql 删除多余帐号_安装完mysql数据库后的优化(删除多余用户和数据库)

    安装完mysql数据库后的优化(删除多余用户和数据库) 发布时间:2020-06-27 19:09:35 来源:51CTO 阅读:2761 作者:冰冻vs西瓜 栏目:数据库 1.查看数据库的版本信息: ...

  3. mysql主键自增长_全面的MySQL优化面试解析

    本文概要 文章内图片有损,需要高清可以在公众号内回复"大图" 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理 ...

  4. mysql数据库限流方案_用于对MySQL数据库的并发操作进行控制的方法及装置的制造方法_3...

    的数据库操作特点,预先设置的所述第一限流类型可以不同于本实施例中的设置,同样可以实现本申请的技术方案,也在本申请的保护范围之内. [0103]步骤102-3:判断MySQL数据库的threads_ru ...

  5. mysql动力节点百度云_动力节点MySQL数据库视频 百度云 网盘 下载

    资源名称:动力节点MySQL数据库视频 百度云 网盘 下载 # o4 E. q% ]2 ?百度网盘下载链接:[/hide]- t4 L+ S# b2 T( }! d) n& d 密码:dff7 ...

  6. mysql不同实例数据同步_两台Mysql数据库数据同步实现实例

    做开发的时候要做Mysql的数据库同步,两台安装一样的系统,都是FreeBSD5.4,安装了Apache 2.0.55和PHP 4.4.0,Mysql的版本是4.1.15,都是目前最新的版本. 1. ...

  7. mysql对数据库进行备份吗_怎么对MySQL数据库进行备份与恢复

    MySQL的备份与恢复 前言:前面我们已经了解了 MySQL 数据库的安装及使用,但随着自动化办公与电子商务的不断发展,企业对信息系统的依赖性越来越高,而 数据库 在信息系统中担任着非常重要的角色.尤 ...

  8. 如何设置mysql让其他人能访问_怎么配置MySQL数据库让别人远程访问

    展开全部 有三种方法: 方法一e69da5e6ba903231313335323631343130323136353331333431336230(不推荐).本地登入mysql,更改 "my ...

  9. mysql中日期相减_如何使用MySQL数据库

    如何使用MySQL数据库 前言:前面我们已经了解了如何搭建MySQL数据库,那么接下来我们就一起来了解一下,如何使用MySQL数据库. MySQL数据库系统也是一个典型的C/S(客户端/服务器)架构应 ...

  10. mysql增删改查脚本_脚本方式实现数据库增删改查

    哇塞,一个空格的问题花了一整天的时间终于找出了错~~~ 1.首先实现查询表中的所有数据: 查看数据库表中信息 String dbUrl= "jdbc:mysql://localhost:33 ...

最新文章

  1. SparCC的微生物网络构建示例
  2. 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?...
  3. 002-layui颜色
  4. 谁会C语言,谁会c语言程序设计
  5. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
  6. 用户 'sa' 登录失败。 (Microsoft SQL Server,错误: 18456)
  7. 探索JavaScript的关闭功能
  8. 怎样查看JVM的默认收集器
  9. 简单工厂模式和策略模式结合使用php
  10. MySQL filesort优化案例一则
  11. linux环境下的多线程编程(一)
  12. Chorme AXURE 插件无效
  13. 在r中弄方差分析表_R语言 | 方差分析(上)
  14. 计算机主机内部接口示意图,电脑主机后面六个孔图解 电脑的各个接口详解
  15. 高斯-拉格朗日(Gauss-Legendre )Ⅱ型求积公式 数值分析 勘误 P111
  16. 使用python获取vCenter默认警报定义
  17. 宾得的宾干微距镜头DA35mm
  18. Intellij IDEA之mybatis-generator自动生成
  19. 前后端分离项目,vue+uni-app+php+mysql外卖点餐系统设计与实现(H5移动项目)
  20. 数据分析练习Ⅱ----图形化显示海地地震危机数据

热门文章

  1. Java黑皮书课后题第8章:***8.35(最大块)给定一个元素为0或者1的方阵,编写程序,找到一个元素都为1的最大的子方阵。程序提示用户输入矩阵的行数。然后显示最大的子方阵的第一个元素、行数
  2. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
  3. 在Myeclipse中没有部署jeesite项目,但是每次运行其他项目时,还是会加载jeesite项目...
  4. win10被微软流氓更新后编译基于visual Studio的web项目报[ArgumentOutOfRangeException: 指定的参数已超出有效值的范围...
  5. Dropwizard入门及开发步骤
  6. [f]动态判断js加载完成
  7. C#自定义开关按钮控件--附带第一个私活项目截图
  8. 你方唱罢我登场,“全宇宙仅此一回”的小米手机青春版竞争策略分析
  9. .NET实现SOA(1)
  10. asp.net出现:当前标识(NT AUTHORITY\NETWORK SERVICE)没有对' '的写访问权限。