更好的查询选择计数在哪里

时间:2012-04-16 23:43:33

标签: mysql count

我在Godaddy主持,他们给我一个适合我的查询,这是可以理解的。我想知道是否有更好的方法来重写这个查询我必须使它资源友好:

SELECT count(*) as count
FROM 'aaa_db'
WHERE 'callerid' LIKE '16602158641' AND 'clientid'='41'

我有超过100万行,并且有重复,因此我写了一个小脚本来输出重复项并删除它们而不是更改表等。

请帮忙。

3 个答案:

答案 0 :(得分:4)

在clientid和callerid上有单独的索引会导致MySQL只使用一个索引,或者在某些情况下,尝试索引合并(MySQL 5.0+)。这些都不如具有多列索引那样有效。

calleridclientid列上创建多列索引将减轻CPU和磁盘IO资源(无表扫描),但会增加磁盘存储和RAM使用。我想你可以试一试,看看Godaddy是否更喜欢那个。

答案 1 :(得分:1)

我要尝试的第一件事是确保您在clientid列上有一个索引,然后重写您的查询以首先查找clientid,这应该从考虑中删除行来加快查询速度。此外,正如Marcus所说,添加多列索引会更快,但记得将其添加为(clientid,callerid),因为mysql从左到右读取索引。

SELECT count(*) as count
FROM aaa_db
WHERE clientid = 41 and callerid LIKE '16602158641';

注意我从clientid值中删除了引号,因为它应该是一个int数据类型,如果不是,转换为int数据类型也应该更快。此外,我不确定为什么你在没有通配符操作符的情况下执行LIKE,如果你可以将其更改为=也会有所帮助。

答案 2 :(得分:1)

我喜欢Marcus的回答,但我会先在callerid上尝试一个索引,因为像16602158641这样的值,有多少行可以匹配一百万?不是很多,因此单个索引可以匹配或超过双索引的性能。

另外,请移除LIKE并使用=

SELECT count(*) as count
FROM aaa_db
WHERE callerid = '16602158641' -- equals instead of like
AND clientid = '41'