MySql重复行字符串比较性能

MySql重复行字符串比较性能,mysql,sql,Mysql,Sql,我有一张超过200万条记录的桌子, 我需要在字符串类型的列中查找重复记录。此外,我还有此字段的索引。 我有下一个问题: select m.* from member as m where lower(m.username) in (select lower(b.username) from member as b where b.Username like 'a%' group by b.username having count(b.username) >= 2); 子查询只返回4条

我有一张超过200万条记录的桌子, 我需要在字符串类型的列中查找重复记录。此外,我还有此字段的索引。 我有下一个问题:

select m.* from member as m
where lower(m.username) in 
(select lower(b.username) from member as b
where b.Username like 'a%'
group by b.username
having count(b.username) >= 2);
子查询只返回4条小于0.2秒的记录,但如果我在where CONTECTIONS部分使用它们,这个查询工作很长时间,并且从不返回结果。。。。 我尝试运行下一个查询,理论上是相同的逻辑:

从成员中选择*作为m,其中在(lower('a1')中选择lower(用户名), 下部('a2')、下部('a3')、下部('a4')

它工作得又好又快

问题是什么?
此外,我希望在运行查询时不使用
其中b.用户名,如'a%'
部分?

在常见情况下,MySQL不能在子查询中使用
索引

这很悲哀,但实际上,MySQL无法识别“常量子查询”。这是什么意思?这意味着,如果您有一个子查询返回静态值列表,并且您在另一个查询的
in
中使用它,MySQL将不会使用索引(按范围)

为什么会这样?

实际上,最正确的一点是-因为MySQL处理以下查询:

.. WHERE `field` IN ('foo', 'bar', 'baz')

-作为不同的查询(我假设第二个查询中表
t
中的列
col
具有相同的值,即
“foo”、“bar”、“baz”
)。第一个查询相当于它的“预期”情况,即值的范围。但第二个查询对于来说是相等的,所以MySQL不会使用索引来实现这一点

该做什么

实际上,您的案例和与之类似的案例是最好将查询分为两部分的案例。第一部分是从表中检索静态值列表。第二部分将把第一部分的结果替换为
子句中的
,然后使用


备选方案-您可以对表本身使用
JOIN
语法。如果您想通过一个查询(或者如果您的列表太长)来解决问题,这似乎很有用。在常见情况下,MySQL不能在子查询中使用索引

这很悲哀,但实际上,MySQL无法识别“常量子查询”。这是什么意思?这意味着,如果您有一个子查询返回静态值列表,并且您在另一个查询的
in
中使用它,MySQL将不会使用索引(按范围)

为什么会这样?

实际上,最正确的一点是-因为MySQL处理以下查询:

.. WHERE `field` IN ('foo', 'bar', 'baz')

-作为不同的查询(我假设第二个查询中表
t
中的列
col
具有相同的值,即
“foo”、“bar”、“baz”
)。第一个查询相当于它的“预期”情况,即值的范围。但第二个查询对于来说是相等的,所以MySQL不会使用索引来实现这一点

该做什么

实际上,您的案例和与之类似的案例是最好将查询分为两部分的案例。第一部分是从表中检索静态值列表。第二部分将把第一部分的结果替换为
子句中的
,然后使用


备选方案-您可以对表本身使用
JOIN
语法。如果您想通过一个查询(或者如果您的列表太长)来解决问题,这可能会很有用。

谢谢Alma,您的意思是我需要手动编写第二个查询,因为在我的情况下,有很多记录的值超过500个,这不是很有用。是的,它是。对于
2.000.000
MySQL中的
500
值,毫无疑问将使用索引(当然,如果它具有良好的基数)。所以,您必须首先在应用程序中选择项目,然后在第二次查询中使用它们。或者,你可以使用
JOIN
syntax,你能为我的案例分享一个关于JOIN的例子吗?谢谢Alma,你的意思是我需要手动编写第二个查询,在我的案例中,很多记录超过500个值,它不是那么有用。是的,它是。对于
2.000.000
MySQL中的
500
值,毫无疑问将使用索引(当然,如果它具有良好的基数)。所以,您必须首先在应用程序中选择项目,然后在第二次查询中使用它们。或者,您可以使用
JOIN
syntax,您能为我的案例分享一个关于JOIN的例子吗?