如何通过主键获取大量数据库表记录?

时间:2010-09-17 11:23:04

标签: c# mysql ado.net select primary-key

使用ADO.NET MySQL Connector,用主键获取大量记录(1000+)的好方法是什么?

我有一个只有几个小列的表和一个VARCHAR(128)主键。目前它有大约10万个条目,但将来会变得更多。

一开始,我以为我会使用SQL IN语句:

SELECT * FROM `table` WHERE `id` IN ('key1', 'key2', [...], 'key1000')

但是这样查询可能会很长,而且我还必须手动转义密钥等中的引号字符。

现在我使用MySQL MEMORY表(tempid INT,id VARCHAR(128))首先使用准备好的INSERT语句上传所有密钥。然后我进行连接以选择所有现有的键,之后我清理内存表中的混乱。

有更好的方法吗?

注意:好吧也许将字符串作为主键不是最好的想法,但如果VARCHAR列是普通索引,那么问题就是一样。

临时表:到目前为止,解决方案似乎是将数据放入临时表,然后是JOIN,这基本上就是我目前所做的事情(见上文)。

4 个答案:

答案 0 :(得分:0)

如果主键遵循某种模式,则可以选择“abc%”之类的键。

如果你想以某种顺序一次输出1000,你可能希望在数据表中有另一个带有聚簇索引的int列。这将与您当前的内存表执行相同的工作 - 允许您按int范围进行选择。

主键的性质是什么?这有什么意义吗?

答案 1 :(得分:0)

如果你担心表现,我绝对不会推荐'IN'条款。如果可以的话,尽量做一个INNER JOIN会更好。

您可以先将所有值插入临时表并加入到该表或执行子选择。最好是实际剖析变化,找出最适合你的变化。

答案 2 :(得分:0)

为什么你不能考虑使用Table值参数以DataTable的形式推送密钥并获取匹配的记录?

或者

只需编写一个私有方法,该方法可以连接所提供集合中的所有密钥代码并返回单个字符串并将该字符串传递给查询。

我认为它可以解决您的问题。

答案 3 :(得分:0)

我在薪资系统中处理过类似的情况,用户需要根据选择的员工(例如员工X,Y,Z...或在某些办公室工作的员工)生成报告。我已经构建了一个包含所有员工的过滤器窗口以及可以被视为过滤条件的所有属性,并且该窗口将所选员工ID保存在数据库的过滤器表中。我这样做是因为:

  1. 使用动态生成的SELECT过滤器生成IN个查询只是丑陋且非常不实用。
  2. 我可以在我需要使用过滤器窗口的所有查询中加入该表。
  3. 可能不是那里最好的解决方案,但服务很好,而且还能很好地为我服务。