【发布时间】:2011-04-13 16:29:03
【问题描述】:
使用 ADO.NET MySQL 连接器,通过主键获取大量记录(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,这基本上是我目前所做的(见上文)。
【问题讨论】:
-
您如何获取查询的键列表?
-
现在重新考虑您的 PRIMARY KEY 是否为时已晚 - VARCHAR(128) 无论如何都不是首选选项,尤其是当您说非键列很小时。跨度>
-
为什么要选择一大块明显不相关的记录?而不是说选择给定列具有特定值或在给定范围内的所有记录?
-
密钥是唯一的电子邮件 ID,因此它们可以是任何东西,我必须使用邮件服务器生成的任何东西。所以,不幸的是我必须使用字符键。问题来自同步:检查现有邮件 ID 是否已存在于数据库中。
-
IN (long,long,long,list,of,items) 策略工作得很好,而且非常有效,对我来说,mySQL 中有几千个项目,在我的例子中是邮政编码文本字符串。 FWIW,它在 Oracle 中限制为 1000 项。如果您在 MEMORY 中使用临时表,如果您有可能一次有多个用户执行此操作(php 类型的应用程序服务器连接被池化:在用户之间共享),请注意保持表名称正确。完成后还要小心删除临时表。
标签: c# mysql ado.net select primary-key