繁体   English   中英

如何设计一个简单有效的MySQL黑名单表

[英]How to design a simple and efficient MySQL blacklist table

假设我有用户表my_users ,其中有一个主键id 另外,我希望设计(在MySQL中)一个简单的黑名单表,其声明如下所示:

CREATE TABLE IF NOT EXISTS black_list (
  user_id INT NOT NULL,
  bad_string VARCHAR(100) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES my_users(id),
  PRIMARY KEY (user_id, bad_string));

black_list中任何行的解释是,标识为user_id的用户希望将字符串bad_string列入黑名单。 显然, user_id不能唯一,因为单个用户可能有多个黑名单字符串。 bad_stringbad_string不能唯一,因为可能有多个用户将同一字符串列入黑名单。 但是,该对( user_idbad_string )应该是唯一的,因为对于用户多次将同一字符串列入黑名单是没有意义的。

在最坏的情况下,当我们通过用户ID( SELECT * FROM black_list WHERE user_id = X )选择一个黑名单时,MySQL将不得不扫描整个black_list表。

我的问题是:有没有办法针对black_list表中的行数在亚线性时间内运行上述SELECT语句? 如果是,我该怎么做?

您认为SELECT * FROM black_list WHERE user_id = X必须扫描整个black_list表的说法是错误的。

在此sql小提琴中 ,您可以看到它正在使用索引:

+----+-------------+------------+------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type |   table    | type | possible_keys |   key   | key_len |  ref  | rows | filtered |    Extra    |
+----+-------------+------------+------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | black_list | ref  | PRIMARY       | PRIMARY |       4 | const |    1 |   100.00 | Using index |
+----+-------------+------------+------+---------------+---------+---------+-------+------+----------+-------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM