共计 2262 个字符,预计需要花费 6 分钟才能阅读完成。
导语: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 为咱们提供的很多的引擎,比方 myisam,innodb,memory 等,你能够针对不同的存储需要抉择最合适你的存储引擎。具体的能够参考这两篇文章: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 优化方面的内容,如果有什么问题,能够底部发我邮箱分割。