【发布时间】:2010-11-24 14:20:15
【问题描述】:
我正在使用和开发使用 MySQL 作为后端引擎的软件(它可以使用其他软件,例如 PostgreSQL、Oracle 或 SQLite,但这是我们正在使用的主要应用程序)。该软件的设计方式是我们要访问的二进制数据作为 BLOBs 保存在各个列中(每个表都有一个 BLOB 列,其他列有整数/浮点数来表征 BLOB,以及一个带有 BLOB 的 MD5 散列的字符串列)。这些表通常有 2、3 或 4 个索引,其中一个始终是 MD5 列,即UNIQUE。有些表已经有数百万个条目,它们的大小已经进入了数千兆字节。我们在同一台服务器中保留了单独的每年 MySQL 数据库(到目前为止)。对于一般应用程序(Dell PowerEdge 2U 型服务器)来说,硬件是相当合理的(我认为)。
MySQL SELECT 查询相对较快。那里几乎没有抱怨,因为这些(大部分时间)处于批处理模式。但是,INSERT 查询需要很长时间,这会随着表大小(行数)的增加而增加。诚然,这是因为 MD5 列的类型为 UNIQUE,因此每个 INSERT 都必须确定每个新行是否具有对应的已插入的 MD5 字符串。如果有其他索引(不是唯一的),性能会变差,这并不太奇怪(我认为)。但我仍然无法放心,这种软件架构选择(我怀疑将 BLOB 保留在表行中而不是磁盘中会产生重大的负面影响)不是最佳选择。插入并不重要,但有这种感觉是很烦人的。
有没有人遇到过类似情况?使用 MySQL,甚至其他(最好是基于 Linux 的)RDBMes?您愿意提供任何见解,也许是一些性能数据?
顺便说一句,工作语言是 C++(它封装了对 MySQL API 的 C 调用)。
【问题讨论】:
标签: mysql database performance insert indexing