簡體   English   中英

MYSQL SET數據類型的替代方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM