首先,我要指出,我绝不是一个数据库专家。我确实知道如何用几种需要数据库后端的语言编写应用程序,而且我对MySQL、Microsoft和现在的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和8GB内存,但请注意,我的其他配置是默认配置(没有调整任何参数)。
在MEMSQL (v5.5.8,x64)中,我的查询在第一次尝试时大约在3秒中运行。我使用4个vCPU和8GB RAM运行完全相同的虚拟服务器配置,还请注意,我的配置的其余部分是默认配置(没有调整任何参数)。
另外,在MEMSQL中,我运行的是单个节点配置。MySQL也是如此。
我喜欢使用MEMSQL允许我继续开发我的项目,而且我遇到了更大的交叉计算查询和视图,我可以在MEMSQL上运行这些查询和视图。但是,在理想的世界里,我会使用MySQL。我已经认识到,我需要使用一组不同的工具来管理我的实例(即: MySQL工作台在MEMSQL服务器上工作得比较好,但实际上我需要使用开源server和mysql适配器构建视图和表。使用Visual连接器同样有效,但有时会很痛苦,因为某些原因,我可以添加查询,但不能添加表适配器).对不起,我将提交一个单独的问题:)
考虑到这两台虚拟机都是完全相同的配置,并且SSD支持,有人能给我任何建议如何调整我的MySQL实例来运行像上面提到的MySQL上的大型查询吗?我知道我也可以创建内存中的数据库,但我已经看到,这样做可能会出现一些持久性问题,但我不确定。
谢谢!
发布于 2015-09-25 16:59:21
发生这种情况的最可能原因是,您在一个表或两个表中没有joined field索引。根据这一条:
https://www.percona.com/blog/2012/04/04/join-optimizations-in-mysql-5-6-and-mariadb-5-5/
Vanilla只支持嵌套循环联接,这需要索引才能很好地执行(否则它们需要二次时间)。
MemSQL和MariaDB都支持所谓的散列连接,它不需要在表上有索引,而是消耗更多的内存。由于您的数据集对于现代RAM大小来说是非常小的,所以在您的情况下没有注意到额外的内存开销。
因此,要解决这个问题,所需要做的就是在两个表中添加joined field索引。
此外,请描述在单独的问题中连接到MemSQL或在chat.memsql.com上使用开源工具时所面临的问题,以便我们可以在下一个版本中修复它(我为MemSQL工作,与MySQL工具的兼容性是我们的优先事项之一)。
https://stackoverflow.com/questions/32768805
复制相似问题