[英]An alternative to MYSQL SET datatype
我有一列要存儲用戶的訂閱(即他們在我的訂閱平台上訂閱的內容)的列,我嘗試使用SET數據類型,但它的限制為64個值,用戶可以訂閱的內容可能會超過64個,並且如果用戶訂閱了64個以上的項目,那就是一個問題。
我還嘗試了另一個在訂閱時將user_id映射到item_id的表,但是當數據庫開始增長時,這可能是一個缺點。
有更好的主意嗎?
重復屬性的規范方法是第二張表。
尚不清楚為什么您認為單獨的表在“數據庫開始增長時”會成為缺點。
跟進
問:如果我有第二個表,該表具有最多10,000個用戶的訂閱值,而我正在尋找用戶的唯一一個訂閱,則查詢時間會更長。 我正在考慮將用戶的訂閱作為對象存儲在用戶表中,例如字符串對象,我將只查詢它
答:不,如果第二張表具有合適的索引,則查詢第二張表不會花費更長的時間。
該查詢實際上將更快 。
-- sample table
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 ;
-- populate
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 ;
-- total rows
SELECT COUNT(1) FROM user_subscription
COUNT(1)
----------
800000
-- sample query 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
表中的每一行,以查看是否滿足條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.