我的这个表包含大量数据和几个索引列,我需要运行一个查询来计算存在多少重复数据的记录数。这就是我几乎重复的数据的意思:有一个用户表,其中包含一个电话号码列,有时这些数字带有额外的前缀,但我知道数字CC123456
和CCX123456
(CC是国家代码和X额外前缀)是相同的。
我最初的想法是使用子查询,但它在mysql workbench调用它之前运行了25分钟,所以我认为应该有更好的方法来执行此操作。我尝试的查询类似于
/* CC is once again the country code and X is the extra prefix */
SELECT COUNT(*)
FROM users
WHERE CHAR_LENGTH(phone_number) = 13 AND
phone_number LIKE 'CCX%' AND
phone_number IN (
SELECT CONCAT(CC, SUBSTRING(phone_number FROM 3))
FROM users
WHERE CHAR_LENGTH(phone_number) = 12 AND
phone_number LIKE 'CC%'
);
有谁知道我怎么能做得更好?
编辑:我在查询上运行了EXPLAIN,这是结果。 u1和u2只是表的别名,id_store和email只是索引列
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
'1' | 'PRIMARY' | 'u1' | 'range' | 'id_store,id_store_email' | 'id_store' | '31' | NULL | '37604' | 'Using where; Using index'
'2' | 'DEPENDENT SUBQUERY' | 'u2' | 'range' | 'id_store,id_store_email' | 'id_store' | '31' | NULL | '4881464' | 'Using where; Using index'
答案 0 :(得分:0)
自我加入怎么样?像这样的东西(在MySQL中未经测试):
SELECT COUNT(*)
FROM users U, users S
WHERE substring(U.phone_number,1,3)='CCX' and substring(S.phone_number,1,2)='CC' and not(substring(S.phone_number,3,1) = 'X')
and substring(U.phone_number,4,10) = substring(S.phone_number,3,10)
答案 1 :(得分:0)
这是一种格式化的评论,而不是答案。
使用where子句中的函数,如下所示:
where SomeFunction(SomeField) = something
总是很慢。您必须执行该功能的记录越多,它就越慢。如果你能找到办法做这种事情,你可以减少记录数量。
where field1 = whatever
and SomeFunction(SomeField) = something