6

我需要首先指出我绝不是数据库专家。我确实知道如何使用需要数据库后端的多种语言编写应用程序,并且对 MySQL、Microsoft SQL Server 和现在的 MEMSQL 相对熟悉 - 但同样,我不是数据库专家,因此非常感谢您的意见。

我一直在开发一个必须交叉引用几个不同表的应用程序。我最近遇到的一个问题的一个非常简单的例子是,我必须:

  1. 每天,将 600K 到 1M 的记录下拉到一个临时表中。
  2. 比较新数据拉取和旧数据拉取之间的变化。将该信息记录在单独的表格中。
  3. 用新记录重新填充表。

运行 #2 是一个类似于以下内容的查询:

SELECT * FROM (NEW TABLE) LEFT JOIN (OLD TABLE) ON (JOINED FIELD) WHERE (OLD TABLE.FIELD) IS NULL

在这种情况下,我将比较给定字段上的两个表,然后提取更改的信息。

在 MySQL (v5.6.26, x64) 中,我的查询超时。我正在运行 4 个 vCPU 和 8 GB RAM,但请注意,我的其余配置是默认配置(没有调整任何参数)。

在 MEMSQL(v5.5.8,x64)中,我的查询在第一次尝试时运行大约3 秒。我正在运行具有 4 个 vCPU 和 8 GB RAM 的完全相同的虚拟服务器配置,还要注意我的其余配置是默认配置(没有调整任何参数)。

此外,在 MEMSQL 中,我正在运行单节点配置。MySQL 也是如此。

我喜欢这样一个事实,即使用 MEMSQL 让我能够继续开发我的项目,并且我遇到了更大的跨表计算查询和可以运行的视图,这些查询和视图在 MEMSQL 上运行得非常好……但是,在理想的世界中,我会使用 MySQL。我已经遇到了这样一个事实,即我需要使用一组不同的工具来管理我的实例(即:MySQL Workbench 与 MEMSQL 服务器配合得相对较好,但我实际上需要使用开源 SQL Workbench 构建视图和表,并且mysql java 适配器。使用 Visual Studio MySQL 连接器也是如此,可以工作,但有时会很痛苦,由于某种原因,我可以添加查询但不能添加表适配器)...对不起,我将提交一个单独的问题:)

考虑到两台虚拟机的配置完全相同,并且支持 SSD,任何人都可以就如何调整我的 MySQL 实例以在 MySQL 上运行像上面那样的大查询给我任何建议吗?我知道我也可以创建一个内存数据库,但我已经读过这样做可能存在一些持久性问题,不确定。

谢谢!

4

1 回答 1

3

joined field发生这种情况的最可能原因是因为您在一个或两个表中没有索引。根据这篇文章:

https://www.percona.com/blog/2012/04/04/join-optimizations-in-mysql-5-6-and-mariadb-5-5/

Vanilla MySQL 仅支持嵌套循环连接,这需要索引执行良好(否则它们需要二次时间)。

MemSQL 和 MariaDB 都支持所谓的 hash join,它不需要你对表有索引,但是会消耗更多的内存。由于您的数据集对于现代 RAM 大小可以忽略不计,因此在您的情况下不会注意到额外的内存开销。

因此,解决这个问题所需要做的就是joined field在两个表中添加索引。

另外,请在单独的问题中或在 中描述您在连接到 MemSQL 时使用开源工具面临的问题chat.memsql.com,以便我们可以在下一个版本中修复它(我为 MemSQL 工作,与 MySQL 工具的兼容性是其中之一我们的优先事项)。

于 2015-09-25T16:59:21.803 回答