![]() |
1
2
你告诉我们这张桌子有70万行。
这不算多,但你是把它连在一起的,所以在最坏的情况下,引擎必须处理
索引在这里绝对有帮助。 最佳索引取决于数据分布。 下面的查询返回什么?
如果结果接近700k,比如说100k,那么这意味着有很多不同的用户名,你最好关注它们,而不是
我希望有很多不同的用户名,因此,我将在
另一个要考虑的选项是
我会删除所有其他索引,这样乐观者就不能做出其他选择,除非有其他查询可能需要它们。 很可能在表上定义主键也不会造成伤害。
还有一件不重要的事情要考虑。您的数据真的有空值吗?如果没有,则将列定义为
查询将稍微简单一些:
|
![]() |
2
1
不
因为没有索引是有用的,所以您也不必为
|
![]() |
3
0
如果您搜索相关的数据,您应该查找一些数据挖掘工具或弹性搜索,例如,它们可以按您的需要工作。 我有另一个可能的“仅数据库”解决方案,但我不知道它是否有效,或者它是否是最好的解决方案。如果我必须这样做,我会尝试做一个“单词引用”表,由所有非字母数字字符拆分所有电子邮件填写。 在您的示例中,此表将填充:john、smith12、some、subdomain、example和com。每个单词都有一个唯一的ID。然后,另一个表,一个联合表,它将电子邮件与其自己的单词链接起来。两个表都需要索引。 要搜索密切相关的电子邮件,您必须使用regex拆分源电子邮件,并在每个子单词上循环, like this one in the answer (通过连接),然后在单词引用表中查找每个单词,然后在联合表中查找与之匹配的电子邮件。 在这个请求中,您可以通过按电子邮件分组来计算找到的电子邮件匹配的单词数,并只保留最匹配的电子邮件(当然,不包括源电子邮件),从而选择所有匹配的电子邮件的总和。 对这个“不确定的回答”深表歉意,但发表评论的时间太长了。我要举个例子。 下面是一个示例(在Oracle中,但应该与MySQL一起使用),其中包含一些数据:
请求结果:
|
![]() |
4
0
您可以使用
你得到的域名
(因为如果我们用点替换“@”,那么它总是在第二个点到最后一个点之后的部分)。 因此你可以找到
如果速度太慢,则可能需要在这两个组合的列上创建计算列并对其进行索引:
当然,您也可以将这两个部分分开并对其进行索引:
当然,如果您在电子邮件地址列中同时允许大写和小写,那么您还需要应用
|
|
Johnny T · 基于当前值的SQL合并表[重复] 4 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 4 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 4 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 4 月前 |
![]() |
Sax · 规范化Google表格(第一步) 4 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 4 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 5 月前 |