MySQL数据库磁盘优化
作者:佚名 来源:IT168.com 发布时间:2008-11-24 17:29:00
磁盘搜索是性能的很大瓶颈。这个问题在数据大量增长以至于无法使用有效的缓存时尤为明显。或多或少随即访问大数据库时,就必然会有至少一次磁盘搜索来读数据,两次磁盘搜索来写数据。最小化这个问题的办法就是降低磁盘搜索次数。
增加有效磁盘马达数量(这能减少搜索时的开销)或者将不同的文件链接到不同的磁盘上又或者分盘:
使用符号链接
意思是,把 MyISAM 表的索引文件和/或数据文件从数据目录下通常的地方链接到其他磁盘上(这也是分盘)。如果这个磁盘没有其他用途的话,这对读写次数都比较好。详情请看"7.6.1 Using Symbolic Links"。
分盘
如果有好几个磁盘,就把第一个区块放在第一个磁盘,把第二个区块放在第二个磁盘,以此类推。这意味着正常的数据大小比分盘后的数据小(或者完全一样),这能获得更好性能。分盘完全依赖于操作系统以及分盘的大小,因此要用不同的分盘大小基准测试应用程序。详情请看"7.1.5 Using Your Own Benchmarks"。基准测试的速度的不同完全依赖于分盘大小。依赖分盘设置参数以及磁盘数量,会得到大量不同的测量结果。必须随机或者顺序选择优化方法。
可能会为了可靠性采用 RAID 0+1,这时,就必须用 2*N 个驱动去来保存 N 个驱动器上的数据。如果有足够的内存这可能是最好的方法。不过,这也需要使用卷管理软件来有效地管理数据。
另一个好办法是RAID的级别根据数据的重要性而定。例如,把能重新生成的有点重要的数据保存在RAID 0磁盘上,把很重要的数据如主机信息日志等保存在RAID 0+1或者RAID N磁盘上。RAID N在有很多个写入时可能会有问题,因为会同时请求更新同一个字节位。
在Linux上,可以用 hdparm 来配置磁盘接口以获得更好的性能(在负载下高达100%也不是不可能的)。以下 hdparm 配置选项对MySQL就很合适,对其他应用程序可能也不错:
hdparm -m 16 -d 1
注意,当使用这个命令之后性能和可靠性会依赖硬件,因此我们强烈建议在使用 hdparm 后一定要做测试。请查阅 hdparm 的手册。如果没有正确使用 hdparm,则可能导致文件系统冲突,所以在试验之前备份一下。
还可以在数据库使用的文件系统上设置其参数:如果无需知道文件的最后访问时间(这对数据库系统没用),则在挂载文件系统时使用 -o noatime 选项。这就会略过更新文件系统节点的最后访问时间,也就减少了磁盘搜索。在很多操作系统上,可以在挂载文件系统是使用 -o async 选项以异步更新它。如果你的机器相当的稳定,这会带来性能提升但可靠性并没牺牲多少(默认只能在Linux上这样用)。
1、使用符号链接
可以把数据表或者数据库移动到别的目录下,然后用符号链接到新的位置来代替。你可能想这么做,例如,想要把表分布到不同的磁盘上以提高系统速度,就把它们移动到有更多剩余空间的磁盘上。
建议只是把数据库链接到其他磁盘上,数据表的链接是最后的选择。
1.1 在 Unix 上符号链接数据库
在Unix上,给数据库做符号链接的方法是先在其他磁盘上创建一个目录,然后再把它链接到MySQL数据文件目录下。
shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir
MySQL不支持把一个目录链接成多个数据库。只要没有在数据库间做符号链接,那么它就没问题。假使在MySQL数据文件目录下已经有一个数据库 db1 了,然后把 db1 链接到 db2 :
shell> cd /path/to/datadir
shell> ln -s db1 db2
现在,在 db1 中的表 tbl_a,也会在 db2 中出现。如果有一个客户端要更新 db1.tbl_a 而另一个要更新 db1.tbl_a,这时就会出问题了。
如果确实需要这么做,那么就修改一个源文件。要修改的文件根据MySQL版本不同而不同。MySQL 4.0或更新,在 `mysys/my_symlink.c' 文件中找到以下语句:
if (!(MyFlags & MY_RESOLVE_LINK) ||
(!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
MySQL 4.0以前,在 `mysys/mf_format.c' 文件中找到如下语句:
if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
然后把这个语句改成:
if (1)
在Windows上,在编译MySQL时使用选项 -DUSE_SYMDIR 就能内置支持目录符号链接。这可以让你把不同的数据库放到不同的磁盘上。
1.2 在 Unix 上符号链接数据表
猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧!import pymysql,hashlib结果:单条结果 {'id': 1, &#
- 1. 鼠标的哪个按键被点击?<html><head><script type="text/javas
- 为方便维护和实现开放性,我把调查的好几个主题都放到同一个数据库的同一个表名当中去了但问题是在查询其中一个调查主题时,往往还会显示不相关主题的
- 前言十三届全国人大三次会议作了政府工作报告。这份政府工作报告仅有10500字左右,据悉是改革开放40年以来最短的一次。受到疫情影响,今年的两
- def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print(&quo
- HTML代码: <div class="float" id="float"> 我是个腼腆
- 安装环境:CentOS7 64位 MINI版,安装MySQL5.71、配置YUM源在MySQL官网中下载YUM源rpm安装包:http://
- 第一种:import socket import fcntl import struct def get_ip_address(ifname
- 很多的网站都有记数器,用来记录网站的访问量,这给网站管理员即时了解本网站的运行及访问情况提供了很多的方便。笔者研究过很多用ASP编写的计数器
- mysql> SELECT something FROM tbl_name &nb
- 这篇文章主要介绍了python next()和iter()函数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 测试环境:windows Server 2003 R2一、开始菜单启动项实现用户必须登录才可执行。测试脚本(python代码):import
- 本文实例讲述了python队列原理及实现方法。分享给大家供大家参考,具体如下:队列(queue)是只允许在一端进行插入操作,而在另一端进行删
- 本文实例讲述了GO语言获取系统环境变量的方法。分享给大家供大家参考。具体实现方法如下:package mainimport ( &
- 给出列表切片的格式:[开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同)[开头元素:结尾元素(不含):步长]
- 这篇文章主要介绍了postman和python mock测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 最近发现session的知识有点脱节了,默认设置愣是搞半天,看来忘了不少。今天把一些通用设置贴上来,以备随时回顾。配置文件中设置默认操作(通
- 一、适合创建索引1、字段的数值有唯一性限制根据Alibaba规范,指明在业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。例如,
- sql代码如下:CREATE PROCEDURE Proname //使用CREATE PROCED
- <SCRIPT language=vbscript event=BeforeInitialBind(i