乐趣区

关于mysql:web开发之mysql优化总结

导语:MySQL 是存储网站数据的中央,如果不进行优化的话,会导致申请很慢,响应很慢,影响数据渲染,给产品带来不好的体验,我就本人之前的我的项目教训,说一下如何进行 MySQL 数据表方面的优化工作。

目录

  • 硬件配置
  • 服务器参数
  • 数据库设计
  • sql 语句优化

上面就这四个方面进行论述,剖析总结我在接口我的项目中进行的优化总结经验办法。

硬件配置

  • 个别我的项目

如果你的我的项目比拟小,估算比拟节俭,能够应用 1C1G1M 配置的服务器,装置 mysql5.6 即可;如果我的项目比拟大,估算短缺,能够配置 2C4G5M 等服务器,装置 mysql8 即可。我目前应用的是 MySQL8 版本。

  • 大型项目

如果数据量压力特地大,能够思考购买多台服务器,进行读写拆散,主从同步,主服务器用来写入,而后同步数据到辅服务器,辅服务器用来读取数据,这样压力会变得小一些,然而给开发工作带来的微小的累赘。

能够思考应用官网的 mysql-proxy 来作为一个代理中间件,具体实现办法能够参考这篇文章1

服务器参数

次要是装置 mysql 程序后,如果进行配置项优化,以便达到最大性能,施展出 MySQL 的劣势价值。

在配置文件 my.ini 或者 my.cnf 中写入以下参数:

#my.ini
max_connections=200
max_connect_errors=10
default-storage-engine=INNODB
#mysql_native_password
default_authentication_plugin=mysql_native_password
ngram_token_size=2
default-time_zone='+8:00'

包含最大连接数,最大连贯谬误,明码兼容性,时区设置东八区等。

我感觉这些就基本上能够了,如果你还想进一步优化,能够参考以下文章2

数据库设计

设计规范

  • 范式设计

当咱们进行关系型数据库设计时,要遵循不同的标准,设计出正当的关系型数据库,那么这些不同的标准就会产生不同的范式,越高的范式冗余越小。

目前关系型数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯 - 科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完满范式)。

  • 第三范式

一般来说,数据库只须要满足第三范式就行了,当然了,这个范式也是人定的,必然有优缺点,你能够依据你本人的理论状况来定义你所采纳的标准。

第三范式次要是表中的字段和主键间接对应不依附其余两头字段,说白了就是,决定某字段值的必须是主键;毛病在于查问时通常须要 join 很多表,导致查问效率很低。能够适当的进行反范式,进行适当的冗余,以便进步查问效率。

最佳实际

  • 抉择适合的引擎

MySQL 为咱们提供的很多的引擎,比方 myisaminnodbmemory 等,你能够针对不同的存储需要抉择最合适你的存储引擎。具体的能够参考这两篇文章:3

我这个项目选择的是innodb,看中它的主动增长列以及外键束缚个性、提交、回滚和解体恢复能力等事务平安。

  • 建设适当的索引

建设一个索引即可,不加内存,不改程序,不调 sql

  • 抉择适当的字段类型

比方 id 能够采纳 int 类型,类型等字段能够采纳tinyint;文本内容依据大小优先级能够是char>varchar>text;日期依据存储字节能够是timestamp>datetime>date,文件资源只须要存储在服务器的门路即可。通过以上一系列的字段类型优化,能够无效升高存储大小,字节节俭,加重读写压力,提供数据库性能。

  • 适当机会进行写入

先写入和后写入都会对数据库产生影响。

  • 尽量批量操作读写

如果单个频繁的读写,会对服务器产生很大压力,能够采纳批量脚本,批量录入数据。

  • 对数据表进行程度和垂直划分

一个表记录的货色太多,会影响读写效率,能够思考化整为零,进行逻辑划分,一个表拆成多张表。

sql 语句优化

最初一个要优化的中央就是 sql 语句,一条好的 sql 语句能够帮忙咱们实现便捷的 curd 操作,进步读写效率。

  • 慢日志

如果某一天发现零碎查问变慢了,又找不到起因。能够应用这个进行问题定位,然而因为慢查问日志记录信息较多,会影响 mysql 的性能,所以生产环境不倡议长期开启。

在配置文件 my.ini 或者 my.cnf 中写入以下参数。

# slow log
slow_query_log=1 # 1 开启 0 敞开
slow_query_log_file=/usr/local/mysql/data/slow-query.log # 慢查问日志存储文件
long_query_time = 2 # 慢查问日志的工夫定义(秒),默认为 10 秒,多久就算慢查问的日志
log_queries_not_using_indexes=1
  • 语句优化技巧

防止全表字段查问,能够查问某一个,依据条件。

这里有能够参考下。4

对了,我最近写了一个 mysql 语句生成 npm 包,有趣味的能够去理解下,包地址 xqsql

参考文章:

<div id=”mysql-proxy”></div>

  • [1]《mysql 数据库的主从同步,实现读写拆散》

<div id=”mysql-params”></div>

  • [2]《mysql 数据库参数详解》

<div id=”mysql-practice”></div>

  • [3]《MySQL 存储引擎概述 &MyISAM&InnoDB&MEMORY》

<div id=”mysql-statement”></div>

  • [4]《30 条语句优化技巧》

好了,以上就是我做我的项目过程中,发现的,总结的一些对于 mysql 优化方面的内容,如果有什么问题,能够底部发我邮箱分割。

退出移动版