MySQL 如何调优(下)

2023-02-07  本文已影响0人  木叶苍蓝

数据库大量应用程序开发项目中,大多数情况下,数据的操作性能成为整个应用的性能瓶颈。数据库的性能是程序员需要去关注的事情,当设计数据库表结果已经操作数据库(尤其是查询数据时),都需要注意数据操作的性能,本文我们以 MySQL 数据库为例进行讨论。

一、数据库优化目标

1. 减少 IO 次数

IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过 90% 的时间都是 IO 操作所占用,减少 IO 次数是 SQL 优化中需要第一优先考虑。当然,也是收效最明显的优化手段。

2. 降低 CPU 计算

除了 IO 瓶颈之外,SQL 优化中需要考虑的就是 CPU 运算量的优化了。ORDER BY,GROUP BY,DISTINST ... 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们sql 优化的重要目标。


MySQL查询过程.png

二、数据库优化方法

1. SQL 语句优化

明确了优化目标之后,我们需要确定达到我们的目标的方法。对于SQL语句来说,达到上述2个优化目标的方法其实只有一个,那就是改变SQL的执行计划,让他尽量"少走弯路",尽量通过各种"捷径"来找到我们需要的数据,已达到“减少IO次数”和“降低CPU计算”的目标。

SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有 SQL,尤其是在调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。

2. 表结构优化

MySQL 数据库时基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个 page 中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。

数据类型选择

原则是:数据行的长度不要超过 8020 字节,如果超过了这个长度的话在物理页中数据会占用两行从而造成存储碎片,降低查询效率;字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设的短一些;这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。

字符编码

字符集直接决定了数据在 MySQL 中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少 IO 操作次数。

尽量使用 NOT NULL

NULL 类型比较特殊,SQL 难优化。虽然 MySQL NULL 类型和 Oracle 的 NULL 有差异,会进入索引中,但如果是一个组合索引,那么这个 NULL 类型的字段会极大影响整个索引的效率。虽然 NULL 空间上可能确实有一定节省,倒是带来了很多其他的优化问题,不但没有将 IO 量省下来,反而加大了 SQL 的 IO 量。所以尽量确保 DEFAULT 值不是 NULL ,也是一个很好的表结构设计优化习惯。

3. 数据库架构优化
分布式和集群化
4. 其他优化
上一篇 下一篇

猜你喜欢

热点阅读