mysql数据库优化韩顺平_韩顺平 Mysql数据库优化(一) 优化概述
第 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数据库优化(一) 优化概述相关推荐
- 如何做优化SEO排名_海南哪个公司可以做_seo优化
有需要交流的可以加我微信pangna169.原文来之:如何做优化SEO排名_海南哪个公司可以做_seo优化 在一家专业的网络营销公司中,他们的SEO团队需要有着多种不同的专业角色构成,现在的互联网时代 ...
- mysql 删除多余帐号_安装完mysql数据库后的优化(删除多余用户和数据库)
安装完mysql数据库后的优化(删除多余用户和数据库) 发布时间:2020-06-27 19:09:35 来源:51CTO 阅读:2761 作者:冰冻vs西瓜 栏目:数据库 1.查看数据库的版本信息: ...
- mysql主键自增长_全面的MySQL优化面试解析
本文概要 文章内图片有损,需要高清可以在公众号内回复"大图" 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理 ...
- mysql数据库限流方案_用于对MySQL数据库的并发操作进行控制的方法及装置的制造方法_3...
的数据库操作特点,预先设置的所述第一限流类型可以不同于本实施例中的设置,同样可以实现本申请的技术方案,也在本申请的保护范围之内. [0103]步骤102-3:判断MySQL数据库的threads_ru ...
- mysql动力节点百度云_动力节点MySQL数据库视频 百度云 网盘 下载
资源名称:动力节点MySQL数据库视频 百度云 网盘 下载 # o4 E. q% ]2 ?百度网盘下载链接:[/hide]- t4 L+ S# b2 T( }! d) n& d 密码:dff7 ...
- mysql不同实例数据同步_两台Mysql数据库数据同步实现实例
做开发的时候要做Mysql的数据库同步,两台安装一样的系统,都是FreeBSD5.4,安装了Apache 2.0.55和PHP 4.4.0,Mysql的版本是4.1.15,都是目前最新的版本. 1. ...
- mysql对数据库进行备份吗_怎么对MySQL数据库进行备份与恢复
MySQL的备份与恢复 前言:前面我们已经了解了 MySQL 数据库的安装及使用,但随着自动化办公与电子商务的不断发展,企业对信息系统的依赖性越来越高,而 数据库 在信息系统中担任着非常重要的角色.尤 ...
- 如何设置mysql让其他人能访问_怎么配置MySQL数据库让别人远程访问
展开全部 有三种方法: 方法一e69da5e6ba903231313335323631343130323136353331333431336230(不推荐).本地登入mysql,更改 "my ...
- mysql中日期相减_如何使用MySQL数据库
如何使用MySQL数据库 前言:前面我们已经了解了如何搭建MySQL数据库,那么接下来我们就一起来了解一下,如何使用MySQL数据库. MySQL数据库系统也是一个典型的C/S(客户端/服务器)架构应 ...
- mysql增删改查脚本_脚本方式实现数据库增删改查
哇塞,一个空格的问题花了一整天的时间终于找出了错~~~ 1.首先实现查询表中的所有数据: 查看数据库表中信息 String dbUrl= "jdbc:mysql://localhost:33 ...
最新文章
- SparCC的微生物网络构建示例
- 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?...
- 002-layui颜色
- 谁会C语言,谁会c语言程序设计
- MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
- 用户 'sa' 登录失败。 (Microsoft SQL Server,错误: 18456)
- 探索JavaScript的关闭功能
- 怎样查看JVM的默认收集器
- 简单工厂模式和策略模式结合使用php
- MySQL filesort优化案例一则
- linux环境下的多线程编程(一)
- Chorme AXURE 插件无效
- 在r中弄方差分析表_R语言 | 方差分析(上)
- 计算机主机内部接口示意图,电脑主机后面六个孔图解 电脑的各个接口详解
- 高斯-拉格朗日(Gauss-Legendre )Ⅱ型求积公式 数值分析 勘误 P111
- 使用python获取vCenter默认警报定义
- 宾得的宾干微距镜头DA35mm
- Intellij IDEA之mybatis-generator自动生成
- 前后端分离项目,vue+uni-app+php+mysql外卖点餐系统设计与实现(H5移动项目)
- 数据分析练习Ⅱ----图形化显示海地地震危机数据
热门文章
- Java黑皮书课后题第8章:***8.35(最大块)给定一个元素为0或者1的方阵,编写程序,找到一个元素都为1的最大的子方阵。程序提示用户输入矩阵的行数。然后显示最大的子方阵的第一个元素、行数
- Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
- 在Myeclipse中没有部署jeesite项目,但是每次运行其他项目时,还是会加载jeesite项目...
- win10被微软流氓更新后编译基于visual Studio的web项目报[ArgumentOutOfRangeException: 指定的参数已超出有效值的范围...
- Dropwizard入门及开发步骤
- [f]动态判断js加载完成
- C#自定义开关按钮控件--附带第一个私活项目截图
- 你方唱罢我登场,“全宇宙仅此一回”的小米手机青春版竞争策略分析
- .NET实现SOA(1)
- asp.net出现:当前标识(NT AUTHORITY\NETWORK SERVICE)没有对' '的写访问权限。