我在Godaddy主持,他们给我一个适合我的查询,这是可以理解的。我想知道是否有更好的方法来重写这个查询我必须使它资源友好:
SELECT count(*) as count
FROM 'aaa_db'
WHERE 'callerid' LIKE '16602158641' AND 'clientid'='41'
我有超过100万行,并且有重复,因此我写了一个小脚本来输出重复项并删除它们而不是更改表等。
请帮忙。
答案 0 :(得分:4)
在clientid和callerid上有单独的索引会导致MySQL只使用一个索引,或者在某些情况下,尝试索引合并(MySQL 5.0+)。这些都不如具有多列索引那样有效。
在callerid
和clientid
列上创建多列索引将减轻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'