从 MYSQL 数据库到 select 最有效的方法是什么
What is the most efficient way to select from MYSQL database where the condition on a coloumn which has NULL, one userId or list of userIds
我有一个 table,它有 userId 和一个长文本属性。如下,
table 包含大约 200 万行,需要 select 行给定的 userId(所有 userId 为 NULL 的行)。由于UserId为NULL的行有3种,UserId只有一个值,UserId有多个UserId,用'/'隔开。 (我知道将这些值分开并规范化 table 很好,但这是要求。)
所以我的问题是什么是 suitable 方法来检索行。现在我已经实现了两种方法,
"SELECT * FROM user WHERE userId LIKE '%" + userId + "%' OR userId is null"
- 将 userId 具有值列表的行分隔到另一个 table 中,并使用
"SELECT * FROM user1 WHERE userId = '" + userId + "' OR userId is NULL"
从第一个 table 中检索行,然后使用 like 从第二个 table 中检索行查询 ("SELECT * FROM user2 WHERE userId LIKE '%" + userId + "%'"
)
机器人方法具有相同的 efficiency.So 还有其他方法吗?或者这些方法有什么改进吗?
如果你真的,真的,坚持保持当前 table 原样,并故意选择不规范化你的数据库,那么我只能建议创建另一个 table "normalizes" 这个特定查询的 'users' 值。创建一个新的 table 来保存您当前存储在 UserId
字段中的规范化值,并为您的特定查询使用新创建的 table.
在这种特定情况下:你可以吃蛋糕也可以吃!您可以开始进行数据库规范化工作,但还没有必要删除当前的 UserId
字段。您将 需要确保您同时保留(UserId
字段和新创建的table FK)'in sync' 但除此之外您应该可以走了。您可以 'slowly migrate' 使用新创建的 table,当您的应用程序不再依赖 /
分隔的 UserId
字段时,您可以删除该列然后。同时,您可以为正在处理的新(更)代码(包括当前查询)获得(更好的)规范化数据库的好处。
哦,当然,请确保您新创建的 table 具有正确的索引,以进一步提高查询的性能。
我有一个 table,它有 userId 和一个长文本属性。如下,
table 包含大约 200 万行,需要 select 行给定的 userId(所有 userId 为 NULL 的行)。由于UserId为NULL的行有3种,UserId只有一个值,UserId有多个UserId,用'/'隔开。 (我知道将这些值分开并规范化 table 很好,但这是要求。) 所以我的问题是什么是 suitable 方法来检索行。现在我已经实现了两种方法,
"SELECT * FROM user WHERE userId LIKE '%" + userId + "%' OR userId is null"
- 将 userId 具有值列表的行分隔到另一个 table 中,并使用
"SELECT * FROM user1 WHERE userId = '" + userId + "' OR userId is NULL"
从第一个 table 中检索行,然后使用 like 从第二个 table 中检索行查询 ("SELECT * FROM user2 WHERE userId LIKE '%" + userId + "%'"
)
机器人方法具有相同的 efficiency.So 还有其他方法吗?或者这些方法有什么改进吗?
如果你真的,真的,坚持保持当前 table 原样,并故意选择不规范化你的数据库,那么我只能建议创建另一个 table "normalizes" 这个特定查询的 'users' 值。创建一个新的 table 来保存您当前存储在 UserId
字段中的规范化值,并为您的特定查询使用新创建的 table.
在这种特定情况下:你可以吃蛋糕也可以吃!您可以开始进行数据库规范化工作,但还没有必要删除当前的 UserId
字段。您将 需要确保您同时保留(UserId
字段和新创建的table FK)'in sync' 但除此之外您应该可以走了。您可以 'slowly migrate' 使用新创建的 table,当您的应用程序不再依赖 /
分隔的 UserId
字段时,您可以删除该列然后。同时,您可以为正在处理的新(更)代码(包括当前查询)获得(更好的)规范化数据库的好处。
哦,当然,请确保您新创建的 table 具有正确的索引,以进一步提高查询的性能。