SQL / C# - 多阶段查询,海量数据集

时间:2016-05-11 16:38:12

标签: c# mysql

我在本地存储的MySQL数据库上使用了一个庞大的数据集(> 10M记录* ~16k)。

用户将按字段A / B / C过滤,返回1-200k记录。此查询最多需要一分钟

有了这组数据,我想用SQL做进一步的分析;即动态更改另一组字段,例如D / E / F,具体取决于UI中的设置,仅在较小的数据集上运行这些进一步的查询。

我的问题是 - 从概念上讲 - 在C#/ MySQL中如何最好地解决这个问题;

  

我可以保留原始查询'打开'在MySQL服务器上,并动态调整以适应?   我是否需要将原始查询中的整个数据集存入内存,然后在C#中进一步过滤?   我应该将相关数据复制到临时表中,并在该表上执行查询吗?

1 个答案:

答案 0 :(得分:0)

  

我可以保留原始查询'打开'在MySQL服务器上,动态地   调整适合?

关于SQL的任何SQL服务器变体的初学者教程将向您展示这不是SQL的工作方式,并且自发明以来一直有效。执行的查询被执行 - 想要不同的结果,再次询问。

  

我是否需要将原始查询中的整个数据集存入内存和   然后在C#中进一步过滤它?

没有。我会说在99%的情况下加载所有然后过滤是愚蠢的。是的,我的意思是。数据库用于过滤。在大多数情况下,这意味着您不仅要在客户端上使用更多内存,还必须通过慢速网络连接来提取数据(是的,即使10千兆位与本地内存相比也很慢),只是为了抛弃它。没有意义,除了有限数据集以及大量本地过滤之外,最好是动态地(作为用户类型)。有限的诸如所有国家的列表" - 足够我不打扰网络速度等等。当你变大的那一刻,扔掉的价格太高了。

  

我应该将相关数据复制到临时表中,并执行查询   那张桌子?

为什么你甚至认为完整拷贝+过滤比过滤更快而没有先将整个数据写入另一个表?最重要的是,你遇到了和以前一样的问题 - 你只是把很多工作扔掉了。最重要的是,除非你运行快速SSD的Raid 0 - 你在临时表中找到了非常慢的介质。

说真的,抓一本初学者书。 3个假设,当你知道一些基础知识的时候,所有这些都是错误的。