我有一个名单/单词的阻止列表,有大约500,000个条目。数据的使用是为了防止人们将这些单词作为用户名或名称输入。表结构很简单:word_id, word, create_date
。
当用户点击提交时,我希望系统查找输入的名称是完全匹配还是word%
匹配。
这是实现阻止的唯一方法还是有更好的方法?我不喜欢在提交中查找这么多行的想法,因为它会减慢提交过程。
答案 0 :(得分:1)
考虑几点:
在您的应用程序中检查您的黑名单(业务逻辑),并在您的应用程序中执行比较。这就是它最属于的地方,你可能会有更丰富的编程语言来实现这种逻辑。
将您的50万条记录加载到您的应用程序中,并将其存储在某种缓存中。在每次注册时,对缓存执行检查。这样可以避免在每次注册时碰到你的桌子。它将在您的应用程序中全部存储在内存中,并且性能更高。
确保myEnteredUserName
在开头,结尾以及介于两者之间的任何位置都没有列入黑名单的字词。您的问题专门有一个开始检查,但请确保您不会错过123_BadWord999
。
缓存带来了一系列新的挑战;考虑每天n分钟或在特定时间或事件从数据库重新加载。这将允许加载新的列入黑名单的单词,并将旧的单词抛出。
答案 1 :(得分:0)
你不能where 'loginName' = word%
。 %只能在文字字符串中使用,而不能作为列数据的一部分使用。
您需要说where 'logi' = word or 'login' = word or ...
,其中您将登录名的子字符串与坏字进行比较。您需要测试每个子字符串,其长度介于最短和最长的坏字之间,包括在内。
确保您的表格word
列上有索引,并查看效果如何。
其他方法是: