我需要首先指出,我绝不是一名数据库专家。我知道如何使用几种需要数据库后端的语言来编程应用程序,并且相对熟悉MySQL,Microsoft SQL Server和现在的MEMSQL - 但同样,不是数据库方面的专家,因此非常感谢您的输入。
我一直致力于开发一个必须交叉引用几个不同表的应用程序。我最近遇到的一个非常简单的问题是,我必须:
运行#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连接器同样适用,但有时会很痛苦,因为某些原因我可以添加查询但不能添加表适配器)...对不起,我&# 39;然后提交一个单独的问题:)
考虑到两个虚拟机的配置完全相同,并且SSD支持,任何人都可以给我任何关于如何调整我的MySQL实例以运行MySQL上面的大查询的建议吗?我知道我也可以创建一个内存数据库,但是我已经读过这样做可能存在一些持久性问题,不确定。
谢谢!
答案 0 :(得分: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都支持所谓的散列连接,它不要求你在表上有索引,但会消耗更多的内存。由于您的数据集对于现代RAM大小来说可以忽略不计,因此在您的情况下不会注意到额外的内存开销。
因此,解决该问题所需要做的就是在两个表中的joined field
上添加索引。
另外,请在单独的问题或chat.memsql.com
中描述使用开源工具时遇到的问题,以便我们可以在下一个版本中修复它(我为MemSQL工作,和MySQL工具的兼容性是我们的优先事项之一。)