我需要首先指出,我绝不是一个数据库专家.我知道如何使用几种需要数据库后端的语言来编程应用程序,并且相对熟悉MySQL,Microsoft sql Server和现在的MEMsql – 但同样,不是数据库方面的专家,所以非常感谢您的输入.
我一直在开发一个必须交叉引用几个不同表的应用程序.我最近遇到的一个非常简单的问题是,我必须:
>每天将600K到1M的记录下拉到临时表中.
>比较这个新数据拉和旧数据之间的变化.将该信息记录在单独的表中.
>使用新记录重新填充表.
运行#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,我的查询在第一次尝试时运行大约3秒.我正在使用4个vcpu和8 GB RAM运行完全相同的虚拟服务器配置,还要注意我配置的其余部分是默认配置(没有调整任何参数).
此外,在MEMsql中,我正在运行单节点配置. MysqL也是如此.
我喜欢使用MEMsql让我继续开发我的项目的事实,而且我遇到了更大的跨表计算查询和我可以运行的视图,这些查询和视图在MEMsql上运行得非常好……但是,在理想的世界中,我会用MysqL.我已经遇到过这样一个事实:我需要使用一组不同的工具来管理我的实例(即:MysqL Workbench与MEMsql服务器的工作相对较好,但我实际上需要使用开源sql Workbench构建视图和表格,使用Visual Studio MysqL连接器同样适用于工作,但有时会很痛苦,因为某些原因我可以添加查询但不能添加表适配器)…抱歉,我会单独提交问题:)
考虑到两个虚拟机的配置完全相同,并且SSD支持,任何人都可以给我任何关于如何调整MysqL实例以运行MysqL上面的大查询的建议吗?我知道我也可以创建一个内存数据库,但我读过可能会有一些持久性问题这样做,不确定.
谢谢!
https://www.percona.com/blog/2012/04/04/join-optimizations-in-mysql-5-6-and-mariadb-5-5/
Vanilla MysqL仅支持嵌套循环连接,这需要索引执行良好(否则它们需要二次时间).
Memsql和MariaDB都支持所谓的散列连接,它不需要你在表上有索引,但会消耗更多的内存.由于您的数据集对于现代RAM大小来说可以忽略不计,因此在您的情况下不会注意到额外的内存开销.
因此,解决该问题所需要做的就是在两个表中的连接字段上添加索引.
另外,请在单独的问题或chat.memsql.com中描述使用开源工具时遇到的问题,以便我们可以在下一个版本中修复它(我为Memsql工作,兼容MysqL工具是我们的优先事项之一).