设为首页 加入收藏

TOP

MYSQL性能调优(一)
2015-11-21 02:06:14 来源: 作者: 【 】 浏览:2
Tags:MYSQL 性能

摘要

为了学习研究MySQL数据库在工作原理,深刻理解MySQL在企业运用时如何保证其高效运行。分别从表结构的优化,SQL语句的优化,存储引擎的选择,索引的优化以及现今MySQL的发展与其他企业级数据库的比较。介绍了从编码选择到数据类型的选择以及从整体的角度设计表结构。在SQL语句的选择和使用的介绍的时候,深入介绍了一些基本的使用原则以及在一般在使用过程中我们存在的误区以及如何解决这些问题。着重介绍了MySQL的几个存储引擎MyISAM、InnoDB和NDBCluster的差异以及各自的适用范围。有介绍了MySQL的索引的一些优化的建议以及高屋建瓴地阐述和比较了MySQL的优劣和发展态势。

?

?

前言

?

?

数据库作为应用作为广泛,地位极为重要的中间件应用,学习和使用数据库管理系统变得越来越重要。为了研究和总结对mysql数据库的学习结果,特别从数据表结构、sql语句优化、存储引擎的选择、索引的应用、以及mysql的比较总结对mysql技术做了一个比较全面升入的介绍。使用mysql的过程中,如何更好地使用与优化越来越重要,在这篇文章中就阐述。

第一章 表结构的优化

数据表是数据库的具体表现形式,设计优良的数据库拥有良好的表结构,者不单单指数据库的表需要满足范式结构,为了更有利于具体操作,表结构还需要实际的可扩展性,以便于做增删改查,又需要根据数据表的具体作用做出调节。在系统中被大量查询的表的结构的设计会对系统性能产生极大的影响。如果说系统的和核心是数据库的话,那么设计数据库的核心就是表结构的设计。

1.1 编码的选择

字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。不要使用UTF-8或其他UNICODE字符类型,这样可以节约大如果没有需要使用多语言,那么最好量的存储空间。

比如中文就可以选择GBK或者GB2313,而GBK是对GB2313的扩展,选择的时候可视情况而定。

1.2 表的拆分

有些时候,我们可能会希望将一个完整的对象对应于一张数据库表,这对于应用程序开发来说是很有好的,但是有些时候可能会在性能上带来较大的问题。当我们的表中存在类似于TEXT或者是很大的VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理IO次数,也能大大提高内存中的缓存命中率。

1.3 数据类型的选择

数据库操作中最为耗时的操作就是IO处理。据统计,数据库操作90%以上的时间都花在了IO上面。所以尽可能减少IO量,可以在很大程度上提高数据库操作的性能。

MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低IO操作次数并提高缓存命中率。数据类型选择的核心思想很简单,就是吝啬地选择所占空间最小的数据类型。

下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:

1.3.1 数字类型

尽量不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,可以乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。对于整数的存储,在数据量较大的情况下,需要分开 TINYINT、INT和BIGINT的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,最好添加unsigned定义。

1.3.2 字符类型

尽量减少使用TEXT数据类型,因为它的性能要低于char或者是varchar类型的处理。定长字段,使用CHAR 类型,不定长字段使用VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。

1.3.3 时间类型

尽量使用TIMESTAMP类型,其存储空间只需要 DATETIME类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。

1.3.4 ENUM & SET

对于状态字段,使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。如果是存放可预先定义的属

性数据可以使用SET类型,即使存在多种属性,同样可以游刃有余,同时还可以节省不小的存储空间。

1.3.5 LOB类型

尽量不要数据库中存放 LOB 类型数据,对于这类大的数据类型,还是使用文件形式存储。

1.4 适度冗余

以join操作为例,mysql每次join都会有一定的性能的要求,如果该操作需要大量的进行而所取到又是独立的小字段,在这种情况下将该字段合并在一张表内能够大大地降低IO,提高效率。不过,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新。

另外就是NULL了,如果是一个组合索引,那么这个NULL类型的字段会极大影响整个索引的效率。此外NULL在索引中的处理也是特殊的,也会占用额外的存放空间。很多人觉得 NULL 会节省一些空间,所以尽量让NULL来达到节省IO的目的,但是大部分时候这会适得其反,虽然空间上可能确实有一定节省,倒是带来了很多其他的优化问题,不但没有将IO量省下来,反而加大了SQL的IO量。所以尽量确保默认值值不是 NULL,也是一个很好的表结构设计优化习惯。

?

?

?

?

第二章 SQL语句的优化

在进行SQL优化的时候,我们必须明确目的,也就是减少IO次数。

IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是IO操作所占用的,减少IO次数是SQL优化中需要第一优先考虑。当然,也是收效最明显的优化手段。另外就是降低CPU计算了,除了IO瓶颈之外,SQL优化中需要考虑的就是CPU运算量的优化了。order by, group by,distinct…都是最消耗CPU的,因为这些操作基本上都是CPU处理内存中的数据比较运算。当我们的IO优化做到一定阶段之后,降低CPU计算也就成为了我们SQL优化的重要目标。

2.1 SQL优化原则

一般情况下,写好SQL语句首先需要一个良好的思路,如何将几张有用的表通过一个清晰的关系连接起来。往往思路越清晰得到的SQL的性能也就越好,要是本来简单的关系通过绕了一圈得到了一个结果,可想而知计算机处理的时候也就要绕一大圈,自然降低了执行的性能。

2.1.1 尽量少join

MySQL的优势在于简单,但这在某些方面其实也是其劣势。MySQL优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表Join,一方面由于其优化器受限,再者在Join这方面所下的功夫还不够,所以性能表现离Oracle等关系型数据库

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Mysql大小写敏感 下一篇MySQL加载JDBC驱动程序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: