我们遇到了一个问题,查询一个大约有 5000 万行且索引大小为 4 GB(表大小约为 6 GB)的表导致数据库服务器交换内存,并显着减慢。我很确定这与超出临时表大小有关,并且它被交换到磁盘。
如果我将我的数据库服务器从 32 GB RAM 升级到 64 GB RAM,我想知道 MySQL 数据库是否能够充分利用这个额外的内存而不是交换。我已经研究了一些变量(例如 KEY_BUFFER_SIZE 等...),它们似乎支持超过 64 GB 的设置值。但是,MySQL 文档说 tmp_table_size 最大为 4 GB。
那么内存升级值得吗?“查询大表”问题会从中受益,还是因为 4 GB 的限制而无济于事?我知道还有其他可能的解决方案,例如重组以不同方式分区的表等......但是如果不改变表的任何内容,额外的内存会有所帮助吗?
另外,一般来说,当从 32 GB RAM 移动到 64 GB RAM 时,是否还有其他与内存相关的变量是 MySQL 无法利用的?
我们使用 64 位 linux (Ubuntu) 作为我们的数据库服务器。
谢谢,盖伦
在我们的应用程序中,我们使用 Hibernate 和 PostgreSQL 来存储数据。在我们的一个数据库表中,我们有一个鉴别器列,例如“TIPPSPIEL”。它是一个固定字符串,不能被任何用户操纵。
突然,我们在这张巨大的表格中出现了一个条目,其中有“TIPPQPIEL”而不是“TIPPSPIEL”。我们不知道这是怎么发生的。
有没有可能我们的硬盘在切换一位,所以我们的字母“S”不再编码为“1010001”而是突然变成硬盘上的“Q”,一位切换如下:1010011?
我不是硬盘方面的专家,有点物理,但我猜操作系统或磁盘有校验和和其他东西来确保这不会发生。
是否有可能只切换一位,所以我的文件向我显示字母“Q”而不是“S”?
更新:我们做了进一步的分析。我们的从数据库从主数据库(PostgreSQL 功能)获取其 WAL 记录。无论如何:我们的从服务器应该是同步的。但是从站在这一特定行上并不同步。我们可以看到它发生在几天前,没有用户对这个特定条目进行任何交互。所以它必须有点翻转。害怕!
我正在尝试完成以下任务:
但是,由于对 MSSQL 的经验非常有限,我不能。有什么建议?
附加信息:
源数据库服务器:SQL Server 2000
目标数据库服务器:SQL Server 2005
这是很容易让我连接到我的远程MySQL服务器上使用AWS sequelpro,但是我用的MongoDB做同样的事情挣扎。
我尝试通过命令行设置 ssh 隧道,如下所示:
ssh -fN -l root -i path/to/id_rsa -L 9999:host.com:27017 host.com
Run Code Online (Sandbox Code Playgroud)
我也试过用 ip 地址替换主机
这个想法是将端口 9999 上的所有 mongodb 连接转发到主机上端口 27101 上的连接。但是当我运行命令时:
mongo --host localhost --port 9999
Run Code Online (Sandbox Code Playgroud)
连接失败,我得到了这个:
MongoDB shell version: 2.6.0
connecting to: localhost:9999/test
channel 2: open failed: connect failed: Connection timed out
channel 3: open failed: connect failed: Connection timed out
2014-05-22T14:42:01.372+0300 DBClientCursor::init call() failed
2014-05-22T14:42:01.374+0300 Error: DBClientBase::findN: transport error: localhost:9999 ns: admin.$cmd query: { whatsmyuri: 1 } at src/mongo/shell/mongo.js:148
exception: connect failed …Run Code Online (Sandbox Code Playgroud) 我很好奇是否有人在文件系统和数据库性能之间做过任何实验或比较。在 Linux 上,我想知道 postgres 数据库的最佳文件系统是什么。此外,哪些设置(inode 等)最适合它?根据数据库中的数据,这可能会大不相同吗?
如果您正在寻找有关一般文件系统/数据库性能的问题,这篇文章有一些很好的信息。
但是,我想获得尽可能多的关于插入性能而不是读取性能的建议。感谢所有伟大的答案!
在设置 MySQL 以提高性能方面,我是一个非常大的菜鸟。老实说,我并不担心从 MySQL 中挤出最后一点性能的微调,但我知道提供一些最佳结果的最重要的事情是正确设置缓存/缓冲区。
我试图通过仅使用 InnoDB 作为存储引擎来保持简单。而且我确实有一个用于 MySQL 的专用服务器。它有 8GB 的 RAM,我应该如何分配它以最大限度地提高性能?我希望能够将我的整个数据库放入内存以获得最佳性能。数据库大约5GB。这可能吗?
我应该为查询缓存分配多少内存?InnoDB 缓冲池多少钱?计算机的其余部分(即非 MySQL 相关进程)多少钱?等等。
由于我没有使用 MyISAM,所以我真的不需要在密钥缓存中放入大量内存,对吗?
我经常听到人们发表诸如“我们的 MySQL 服务器机器失败”之类的陈述,这给我的印象是他们将一台机器专门用作他们的 MySQL 服务器(我猜他们只是安装了操作系统,并且只在上面安装了 MySQL)。作为开发人员而不是系统管理员,我习惯于将 MySQL 作为 LAMP 堆栈的一部分与 Web 服务器和 PHP 一起安装。
谁能给我解释一下:
我需要定期更改 mysql 5.1 中的表,主要是添加列。使用 alter table 命令非常简单。但是我的表现在有多达 4000 万行,而且它们增长得很快……所以那些 alter table 命令需要几个小时。几个月后,我猜他们会花几天时间。
由于我使用的是 amazon RDS,因此我无法使用从服务器然后升级为主服务器。所以我的问题是是否有办法以最少的停机时间做到这一点?如果用户仍然可以使用数据库,我不介意花费数小时甚至数天的操作......他们至少可以在添加列时阅读吗?如果我的应用尝试写入会发生什么?插入还是更新?如果它立即失败,那实际上并没有那么糟糕,如果它只是挂起并导致数据库服务器出现问题,那就是一个大问题..
这一定是一个相当普遍的缩放问题,每个人都需要添加列.. 通常对生产数据库做什么?从 -> 主迁移?
更新- 我忘了提到我正在使用 innodb 存储引擎
我所知道的关于它们的差异是varchar有限的,而text不是有限的。该文件没有提及这一点。
这真的是唯一的区别吗?不考虑性能等?
我create database dbname;用来创建数据库。
但我希望它使用字符集 UTF-8 创建
任何人都知道要使用的命令是什么?
database ×10
mysql ×5
postgresql ×3
innodb ×2
memory ×2
performance ×2
64-bit ×1
charset ×1
command ×1
filesystems ×1
hard-drive ×1
linux ×1
master-slave ×1
mongodb ×1
sql-server ×1
ssh ×1
ssh-keys ×1
ssh-tunnel ×1
utf-8 ×1