gpt4 book ai didi

php - MYSQL SET 数据类型的替代方案

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:27 25 4
gpt4 key购买 nike

我有一列我想存储用户的订阅(即他们在我的订阅平台上订阅的内容)我尝试使用 SET 数据类型,但它有 64 个值的限制,用户可以订阅的值可能超过 64如果用户订阅超过 64 个项目,就会出现问题。

我还尝试过使用另一个表在订阅时将 user_id 映射到 item_id,但是当数据库开始增长时这可能是一个缺点。

谁有更好的主意?

最佳答案

重复属性的规范方法是第二张表。

完全不清楚为什么您认为“当数据库开始增长时”单独的表将是一个缺点。


跟进

问:如果我有第二张表最多包含 10,000 个用户订阅值,而我要查找用户的唯一一个订阅,则查询需要更长的时间。我正在考虑将用户的订阅作为对象存储在用户表中,就像我将查询的字符串对象一样

答:不会,如果第二张表有合适的索引,查询第二张表不会花费更长的时间。

查询实际上会更快

--示例表

CREATE TABLE user_subscription 
( user_id INT(10) UNSIGNED NOT NULL COMMENT 'PK, FK to user.id'
, subscription_id INT(10) UNSIGNED NOT NULL COMMENT 'PK'
, PRIMARY KEY (user_id,subscription_id)
, UNIQUE KEY user_subscription_UX1 (subscription_id,user_id)
) ENGINE=INNODB ;

-- 填充

INSERT INTO user_subscription
SELECT s.d*10000 + u.d*1000 + h.d*100 + t.d*10 + o.d + 1 AS user_id, 1
FROM digit s
JOIN digit u
JOIN digit h
JOIN digit t
JOIN digit o
ORDER BY s.d, u.d, h.d, t.d, o.d ;
INSERT INTO user_subscription
SELECT s.user_id, s.subscription_id + 1
FROM user_subscription s
WHERE s.subscription_id = 1 ;
INSERT INTO user_subscription
SELECT s.user_id, s.subscription_id + 2
FROM user_subscription s
WHERE s.subscription_id <= 2 ;
INSERT INTO user_subscription
SELECT s.user_id, s.subscription_id + 4
FROM user_subscription s
WHERE s.subscription_id <= 4 ;

-- 总行数

SELECT COUNT(1) FROM user_subscription
COUNT(1)
----------
800000

-- 示例查询 1

EXPLAIN
SELECT t.*
FROM user_subscription t
WHERE t.user_id = 878

id select_type table type possible_keys key key_len ref rows Extra
-- ----------- ------ ------ ------------- ------- ------- ----- ------ -----------
1 SIMPLE t ref PRIMARY PRIMARY 4 const 8 Using index

-- 示例查询 2

EXPLAIN
SELECT t.*
FROM user_subscription t
WHERE t.subscription_id = 4

id select_type table type possible_keys key key_len ref rows Extra
-- ----------- ------ ---- --------------------- --------------------- ------- ----- ------ -------------
1 SIMPLE t ref user_subscription_UX1 user_subscription_UX1 4 const 184412 Using index

将其与将用户的“订阅”存储为 VARCHAR 列中的列表进行比较(与用于 SET 的数据库内外表示相同数据类型。并编写查询以识别具有特定订阅的用户,例如

EXPLAIN
SELECT u.user_id
FROM users u
WHERE FIND_IN_SET(4,u.subscriptions)

您会发现 MySQL 需要检查 users 表中的每一行 以查看是否满足条件。

关于php - MYSQL SET 数据类型的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com