超详细MySQL数据库优化

超详细MySQL数据库优化,第1张

数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷

1 优化一览图

2 优化

笔者将优化分为了两大类,软优化和硬优化,软优化一般是 *** 作数据库即可,而硬优化则是 *** 作服务器硬件及参数设置

21 软优化

211 查询语句优化

1首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息

2例:

显示:

其中会显示索引和查询数据读取数据条数等信息

212 优化子查询

在MySQL中,尽量使用JOIN来代替子查询因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高

213 使用索引

索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项:

214 分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,

215 中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时

216 增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询

217 分析表,,检查表,优化表

分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费

1 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;

2 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]

option 只对MyISAM有效,共五个参数值:

3 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁

22 硬优化

221 硬件三件套

1配置多核心和频率高的cpu,多核心可以执行多个线程

2配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度

3配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行 *** 作的能力

222 优化数据库参数

优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能MySQL服务的配置参数都在mycnf或myini,下面列出性能影响较大的几个参数

223 分库分表

因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。

224 缓存集群

如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。

一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了

第三章 关系数据库SQL语言

本章为重点章,应熟悉和掌握SQL的数据定义、数据查询、数据更新的句法及其应用,特别是数据查询的应用。结合上机 *** 作进行理解和掌握。

一、SQL概述。

1、SQL发展历程( 识记 )

SQL从1970年美国IBM研究中心的EFCodd发表论文到1974年Boyce和Chamberlin把SQUARE语言改为SEQUEL语言,到现在还在不断完善和发展之中,SQL(结构式查询语言)虽然名为查询,但实际上具有定义、查询、更新和控制等多种功能。

2、SQL数据库的体系结构( 领会 )

SQL数据库的体系结构也是三级结构 ,但术语与传统关系模型术语不同,在SQL中,关系模式称为“ 基本表 ”,存储模式称为“ 存储文件 ”,子模式称为“ 视图 ”,元组称“ 行 ”,属性称“ 列 ”。

SQL数据库体系的结构要点如下:

(1)一个SQL数据库是表的汇集。

(2)一个SQL表由行集构成,行是列的序列,每列对应一个数据项。

(3)表或者是基本表,或者是视图。基本表是实际存储在数据库中的表,视图由是由若干基本表或其他视图构成的表的定义。

(4)一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。存储文件与物理文件对应。

(5)用户可以用SQL语句对表进行 *** 作,包括视图和基本表。

(6)SQL的用户可以是应用程序,也可以是终端用户。

3、SQL的组成( 识记 )

SQL由四部分组成:

(1)数据定义:SQL DDL定义SQL模式,基本表、视图和索引。

(2)数据 *** 纵:SQL DML包括数据查询和数据更新(增、删、改)。

(3)数据控制:包括对基本表和视图的授权、完整性规则的描述,事务控制等。

(4)嵌入式SQL的使用规定。

二、SQL的数据定义( 简单应用 )

1、SQL模式的创建和撤消:

SQL 模式的创建 可简单理解为建立一个数据库,定义一个存储空间,其句法是:

CREAT SCHEMA 模式名> AUTHORIZATION 用户名>

撤消SQL模式的句法为:

DROP SCHEMA 模式名> [ CASCADE | RESTRICT ]

方括号中的选项参数CASCADE表示连锁方式,执行时将模式下所有基本表、视图、索引等元素全部撤消。RESTRICT表示约束式,执行时必须在SQL模式中没有任何下属元素时方可撤消模式。

2、SQL提供的基本数据类型

数值型:包括 integer、smallint、real、double precision 、float(n),numeric(p,d)

字符串型:char(n)、varchar(n),前者是定长,后者为变长串

位串型:bit(n),bit varying(n),同上。

时间型:date、time

3、基本表的创建、修改和撤消

基本表的创建:(可理解为建立表结构)

CREAT TABLE SQL 模式名。基本表名

(列名,类型,

……

完整性约束……)

完整性约束包括主键子句(PRIMARY KEY)、检查子句(CHECK)和外键子句(Foreign KEY)。

基本表结构的修改

ALTER TABLE 基本表名 ADD/ DROP (增加/删除) 列名 类型名(增加时写出)

删除时有子句 [CASCADE|RESTRICT],前者为连锁删除,后者为约束删除,即没有对本列的任何引用时才能删除。

基本表的撤消

DROP TABLE 基本表名 [CASCADE|RESTRICT]

4、视图的创建和撤消

创建: CREAT VIEW 视图名(列名表) AS SELECT 查询语句

撤消: DROP VIEW 视图名

5、索引的创建和撤消

创建: CREAT [UNIQUE] INDEX 索引名 ON 基本表名(列名表 [ASC|DESC])

撤消: DROP INDEX 索引名

总结:凡创建都用 CREAT ,删除都用 DROP ,改变用 alter ,再跟类型和名字,附加子句很容易了。

三、SQL的数据查询( 综合应用 )

这一段是本章的重点内容,应该熟练掌握。首先了解基本句法:

1、 SELECT -FROM- WHERE 句型

SELECT 列名表(逗号隔开) FROM 基本表或视图序列 WHERE 条件表达式

在这里,重点要掌握条件表达式中各种运算符的应用,如=,>,<,>等算术比较运算符、逻辑运算符 AND、OR、NOT 、集合成员资格运算符: IN,NOT IN ,以及嵌套的 SELECT 语句的用法要特别注意理解。 针对课本的例题和课后习题进行掌握。

在查询时, SELECT 语句可以有多种写法,如 联接查询、嵌套查询和使用存在量词的嵌套查询 等。都掌握,但是起码应能写出一种正确的查询语句。

2 SELECT 语句完整的句法:

SELECT 列名表(逗号隔开)

FROM 基本表或视图序列

[ WHERE 条件表达式] (此为和条件子句)

[GROUP BY 列名序列] (分组子句)

[HAVING 组条件表达式] (组条件子句)

[ORDER BY列名[ASC|DESC]……] (排序子句)

这段关于完整句法的内容能够理解也就问题不大了。

3、 SELECT 语句中的限定

这一段内容主要是对 SELECT 语句进一步使用进行的深入学习,领会下列各种限定的使用目的和方法。

要求输出表格中不出现重复元组,则在 SELECT 后加一DISTINCT

SELECT 子句中允许出现加减乘除及列名,常数的算术表达式

WHERE 子句中可以用BETWEEN……AND……来限定一个值的范围

同一个基本表在 SELECT 语句中多次引用时可用AS来增加别名

WHERE 子句中字符串匹配用LIKE和两个通配符,%和下划线_

查询结果的结构完全一致时可将两个查询进行并(UNION)交(INTERSECT)差(EXCPT) *** 作

查询空值 *** 作不是用='null',而是用 IS NULL来测试。

集合成员资格比较用 IN/NOT IN ,集合成员算术比较用元组θSOME/ALL

可以用子查询结果取名(表名(列名序列))来作为导出表使用

基本表的自然联接 *** 作是用 NATURAL INNER JOIN来实现的。

四、SQL的数据更新( 简单应用 )

简单应用就是掌握基本的句型并能套用在一些简单的查询要求上。

1、数据插入:

INSERT INTO 基本表名(列名表)

valueS (元组值)

INSERT INTO 基本表名(列名表)

SELECT 查询语句

其中元组值可以连续插入。用查询语句可以按要求插入所需数据。

2、数据删除:

DELETE FROM 基本表名 [ WHERE 条件表达式]

3、数据修改:

UPDATE 基本表名

SET 列名=值表达式,[列名=值表达式……]

[ WHERE 条件表达式]

4、对视图的更新:

我们知道,对视图的查询是和基本表相同的,但是更新 *** 作则受到下列三条规则的限制:(领会一下)

如果视图是从多个基本表使用联接 *** 作导出的,则不允许更新。

如果导出的视图使用了分组和聚合 *** 作,也不允许更新。

如果视图是从单个基本表使用选择和投影 *** 作导出的,并且包括了基本表的主键或某个候选键,则可以执行 *** 作。(这就相当于在基本表上 *** 作)。

这一节的关于增删改的 *** 作要和前面关于数据库模式、表的增删改 *** 作进行对比学习,以加深理解。不要忘记上机实践

数据库设计的基本步骤如下:

1、安装并打开MySQL WorkBench软件以后,在软件的左侧边栏有三个选项,分别是对应“连接数据库”、“设计数据库”、“迁移数据库”的功能。这类选择第二项,设计数据库,点击右边的“+”号,创建models。

2、进入MySQL Model界面后,点击“Add Diagram"。

3、然后就进入了EER Diagram的设计页面。可以从左侧的图标中选择要创建的资源。鼠标停留在图标上3秒后,会提示资源的类型。选择资源后,可以在设计页面上方选择属性。

4、这里添加了一张数据库表,添加后,双击,在页面的底部会出现数据库表的编辑框。

5、这里创建一张user表,设置了id、name、age三列。

6、还可以创建外键,左侧提供了四种外键类型。点击后,只需要用鼠标分别选中要关联的两个表即可。Workbench会自动生成对应的外键。

7、在文件、导出中,可以选择导出为sql脚本。

8、下图是导出过程sql脚本的过程。

 要说数据库,一般以SQL Server作为入门的学科,它适合中小型项目开发,而现在比较流行于大型开发的有:

Oracle

现在具有企业大型软件的绝对占有率

DB2 在以IBM服务的公司以及单位(中国银行)

MySql 相对不是很正式的开发,使用MySql

当然还有一些:Access(桌面数据库),FoxPro(中国教育),Informix的数据库系统

刚开始入门的时候可以找点视频教程来学习,视频教程一般讲得比较好,但不要企图于通过它达到比较高的水平。然后要学会将自己所知道的去实践,多实践。当觉得实践到一定程度而没有什么冲劲了,就去学习理论,当觉得理论知识需要发挥的时候就去实践,时间的周期不一定,没有什么定论,但自己的时间安排需要定论就可以了。

我一直都认为在计算机行业要学会一门技术太简单了,但如果要把技术发挥到一定程度就有难处了,一定程度是什么意思,就是把技术如何发挥到具体的业务之中,会动脑筋去思考,而把技术作为相对次要的东西了。

数据库的DBA人员需要兼有系统分析员和运筹学的业务素质。在技术上讲,我个人认为数据库的前续学科是“数据结构”。

我现在刚学SQL Server一段时间,就自己的感想谈谈:

1数据库是非常快的数据处理程序,其内在的本质依旧是"文件"因为

Windows *** 作系统管理机制就有:磁盘、文件、目录。Linux的方式只有文件。所以数据库重本质的角度来说是一种平台软件,是将文件翻译成逻辑语言的软件,成为我们软件程序数据交换的中心,为什么那,一个很重要的原因就是“快”,还有就是“安全”、“集成”等等。因为以前的语言程序要处理数据要编写大量算法十分麻烦而且很容易出错等等。大家就想到集成了。。。。。

2其实,要谈到 *** 作数据库,简单的就太简单了,但是数据库最难的不是 *** 作,而是在数据库的设计上。一个大型程序设计者肯定是一个数据库的高手,因为大型程序要死板地去完成它是非常困难和不理智也是不安全不稳定的,我们要充分利用自己所有的能力去挖掘其数据之间的奥秘,然后体系化数据库结构,相当于在数据库中如何层次化地建立数据结构。将需求中的矛盾事物改变成可以相互融合的。

我说的数据库 *** 作简单是指一般 *** 作,如果难的 *** 作还是有点技术的,但还是难不到那里去。下面我把我的一个小数据库程序给你看看:(下面这个程序已经建立数据库library,然后用dbo用户建立了表relatBook,并将表的第一个字段设置为“主键”PK)

该程序想说的第一点是:程序按照标准用户写入法则写入。

另外就是在执行多个 *** 作的时候每一步骤的 *** 作我们都必须为其设置错误的回滚 *** 作。所以程序前两个段落都是一样的,在插入的时候故意出现异常,看第1和第3个语句是否能成功执行。

从上面看出点什么没有,你我执行了三个 *** 作,第一个 *** 作是肯定成功的,第二个是肯定失败的,第三个跟在后面,那么你想一想第一个和第三个 *** 作能插入数据库中吗?我这个程序没有什么意义,但只是未了说明问题。

答案是:不能。

为什么不能,这是SQL所支持的“事务”外完成的,这是技术问题,没有什么的,会了大家都会。为什么要这样做那,那才是要学习的前提。你想一想如果你建立了一个地区的帐物管理系统,当一个单位向另外一个单位转帐的时候,需要执行两个 *** 作就是将一边的信息刷掉,一边的信息添加上去,而当执行一半的时候出现了某种异常中断,比如高优先级的抢占,服务器重起、停电。当时你知道有多少人在访问你的服务器,那要造成多大的数据库信息丢失,甚至于导致数据库的查询的严重失败。那么我就知道需要上面知识的支持了。

3为什么说上面的东西都很简单那,因为只要你会,那就可以了,而设计方面的东西是永远不是那么简单的,永远带有创新和追求,没有最高的境界。

就一个十分常见的问题,如何在数据库中配合好人员、角色、权限、类别、级别、可 *** 作性这几者的关系,如果是没有经验的人直接上手可能会乱来(我们最早也是这样的)。有经验的人也会设计一段时间,而且随着软件复杂性的增加,其数据库的这几者之间的复杂性就越来越复杂。所以大型软件是非常难的。就一个很简单的例子,在很多的网站中,有上百的栏目信息,而每一个栏目间又保持独立。的位置和的信息都是动态更新的。某些网站的可 *** 作性都以树型结构提供,而树型结构的子树类别和和叶子都是不重复而不错误。而且其层数都是动态的。有些人给我说可以通过前台的判定语句来执行树型结构的生成,但我问了一个问题,如果是一个邮政编码系统,有几十万个邮政编码你在前台要写多少个case语句,而且每一次要遍历一次已经生成的树,还有用前台的case语句编写出来的树型结构其二级子树全部“定死”,而且树型结构的层树也被定死。这不是完全动态级别的网站。为以后对网站的维护带来麻烦。

总之,数据库是一门入门容易却达到高手很难的学科,通过不断在失败中吸取经验,才能得到一些书籍上无法学会的东西,那才是真正的高手。也就是说,学技术是很快的,要会将技术运用于实际的业务分析,才可以成为一个自我型的DBA,而不是一个简单的程序员。

主目录分类要清楚详细(也就是要实现的功能)无论是自己,或别人看到你的数据库名(或表名)都一目了然。

每个表之间的关联要明确,表之间的访问,可读写(也就是安全,约束)要明确这点最重要。

在表字段追加方式和追加内容要明确(每个表字段之间的关系一定要清楚,不然到时候会给你的表结构带来许多不便)。

在这之前最好是写出详细的需求分析说明,用图把层次结构画出来,这要在建的时候才不会混乱。

还有就是当你在写程序涉及到数据库的时候,如果你的WEB(FORM)与最初设计的数据库需求分析不同的话,最好是把需求分析也改为一致。这样才能够同步。尽量避免写程序的时候再回头设计数据库。

以上是我自己的看法,可能同行内有更好的解决办法,多多参考多多总结

数据分析师需要学习的内容1、统计学我看一些人推荐了不少统计学的专业书籍,很多人读《概率论与数理统计》,其他统计相关的内容也没怎么看过。对于互联网的数据分析来说,并不需要掌握太复杂的统计理论。所以只要按照本科教材,学一下统计学就够了。2、编程能力学会一门编程语言,会让你处理数据的效率大大提升。如果你只会在Excel上复制粘贴,动手能力是不可能快的。我比较推荐Python,上手比较快,写起来比较优雅。3、数据库数据分析师经常和数据库打交道,不掌握数据库的使用可不行。学会如何建表和使用SQL语言进行数据处理,可以说是必不可少的技能。4、数据仓库许多人分不清楚数据库和数据仓库的差异,简单来说,数据仓库记录了所有历史数据,专门设计为方便数据分析人员高效使用的。5、数据分析方法对于互联网数据分析人员来说,可以看一下《精益创业》和《精益数据分析》,掌握常用的数据分析方法,然后再根据自己公司的产品调整,灵活组合。

第一步,掌握理论知识点

第二步,练级必须当饭一样每天练,一直到滚瓜烂熟

第三步,把前两步应用到项目上锻炼数据存储的设计开发思维

第四步,不管哪种数据库,如有新技术上的版本或更新,要及时掌握和应用

还有呢?我告诉你没了,就这么简单,四步走完走顺溜,你已经是个数据高手了。

以上就是关于超详细MySQL数据库优化全部的内容,包括:超详细MySQL数据库优化、自考《数据库原理》串讲—关系数据库SQL语言、数据库设计的基本步骤等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9480692.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存