Mysql 如何获取大表中匹配字符串的计数

Mysql 如何获取大表中匹配字符串的计数,mysql,sql,string,count,Mysql,Sql,String,Count,我有一个具有以下结构的表: +-----+-------------------+ | ID | Name | +-----+-------------------+ | 1 | abc | +-----+-------------------+ | 2 | abc (duplicate) | +-----+-------------------+ | 3 | bcd | +-----+-----

我有一个具有以下结构的表:

+-----+-------------------+
| ID  | Name              |
+-----+-------------------+
|   1 | abc               |
+-----+-------------------+
|   2 | abc (duplicate)   |
+-----+-------------------+
|   3 | bcd               |
+-----+-------------------+
|   4 | bcd (duplicate)   |
+-----+-------------------+
|   5 | bcd (duplicate)   |
+-----+-------------------+
|   6 | efg               |
+-----+-------------------+
|   7 | hij               |
+-----+-------------------+
我需要计算每个
名称
发生的次数(包括
(重复)
),即:

我想提到的是,
Name
列实际上具有类型
TINYTEXT
。其中会有很多行:5396已经处于测试模式。我试图通过
TRIM(用分组替换(名称,“(重复)”)
来实现表的自连接:

SELECT
    DISTINCT TRIM(REPLACE(`t`.`Name`, '(duplicate)', '')) as `name`,
    COUNT(`s`.`ID`) as `count`
FROM
    `Table` as `t` INNER JOIN `Table` as `s` ON
        TRIM(REPLACE(`t`.`Name`, '(duplicate)', '')) LIKE TRIM(REPLACE(`s`.`Name`, '(duplicate)', ''))
GROUP BY 1;
而且。。。好吧,花了122.62秒,在我的开发机器上得到了4846行的结果


Q1:这是正确的方法吗

Q2:有没有办法让它更快


如果有任何帮助,我们将不胜感激。

这应该会更快,尽管有这么多行,您基本上存储了一个不断增长的正在计数的对象数组,而且由于它是一个
TINYTEXT
字段,所以它可能非常庞大

select Name,count(ID) from Table group by Name
我明白你在说什么了。以下是更新的SQL:

select DISTINCT TRIM(REPLACE(Name, ' (duplicate)', ''))
as name, count(ID) from Table group by name
只需删除“重复”文本:


哦,你真的在dublicate列中添加了(dublicate)?没有这样的标记。应为?所有名称长度是否为3个字符?@Mr47否,3-255个字符。表排序规则是
utf-8
。您可以计算
name(replicate)
出现的次数,然后只添加1吗?这没有帮助<代码>(重复)s应包括在内<代码>:(因此,您的字段中有“重复”一词在它们里面?是的,我是。我需要计算它们。但是,看起来我发现了我的错误。谢谢。这是一个noobish错误…你的更新看起来像我的查询。谢谢你的努力。看起来我现在需要一个清醒的头脑…在写了很多复杂的查询之后,我的想法是错误的。不用担心。出于兴趣,接受的answer以分钟为单位给出sand结果?我确信我的查询是正确的。但我不确定“distinct”关键字会产生什么影响。请注意,我现在的查询中没有
distinct
按1分组
也这样做。你是对的。
select DISTINCT TRIM(REPLACE(Name, ' (duplicate)', ''))
as name, count(ID) from Table group by name
select replace(name, ' (duplicate)', ''), count(*)
from mytable
group by 1