sql - 使用 SQL 通过索引选择大量行
问题描述
我正在尝试通过名为 ID 的列的值来选择多行。我知道你可以很容易地做到这一点:
SELECT col1, col2, col3 FROM mytable WHERE id IN (1,2,3,4,5...)
但是,如果我想选择几百万个 ID 并且这些 ID 并不总是有模式(这意味着我不能使用 BETWEEN x AND y 之类的东西)怎么办?这个 select 语句是否仍然有效,或者有更好的方法吗?
实际应用是这样的。过滤器由用户指定,与记录的某些属性进行比较。从这些过滤器中,我们创建了特定用户感兴趣的数据子集。大约有 3000 万条记录,每条记录大约有 3000 个属性(存储在大约 30 个表中,但每个表都有 ID 作为主键),所以每次有人查询他们想要的记录子集时,我们都会有加入许多表,应用这些过滤器,并找出他的子集是什么样的。为了避免一直加入很多表,我认为最好只加入一次表,找出所选子集的 id,这样每次进行新查询时,我们所要做的就是选择与过滤后的 id 匹配的行的相关列。
解决方案
这取决于您使用的数据库和界面。对于几百或几千个值,没问题。但是您的问题指定了数百万。这可能会开始限制查询的长度——由数据库、您使用的工具或中间库指定。
如果您有这么多 id,我强烈建议您将它们加载到数据库中的一个表中,并id
以 为主键。然后使用join
orexists
来识别表中匹配的行。
通常,无论如何都会在数据库中生成这样的列表。在这种情况下,您可以使用子查询或 CTE,并在最终查询中包含该代码。
推荐阅读
- powerbi - 复杂的 DAX 度量 - 留存收益的计算
- command-line-interface - 登录前在 Alcatel CLI 上显示消息
- javascript - 有没有办法循环对象数组的数组?
- ios - Ionic Geofence 插件在 Xcode for iOS 中不起作用
- apache-spark - 如何从 Spark 访问 Hive?
- ios - 在 wkwebview 中更新 Youtube 播放器后显示空白白屏
- c# - 使用 axios react 和 .net core 上传大文件
- python - 仅使用 selenium 抓取文本
- indexing - 如何在训练/测试拆分后使用交叉验证验证
- mysql - laravel 的 join() 后面实际使用的是哪个 join?