如何改进计数查询?

时间:2013-12-27 17:40:40

标签: mysql sql

我的这个表包含大量数据和几个索引列,我需要运行一个查询来计算存在多少重复数据的记录数。这就是我几乎重复的数据的意思:有一个用户表,其中包含一个电话号码列,有时这些数字带有额外的前缀,但我知道数字CC123456CCX123456(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'

2 个答案:

答案 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