我被托管在Godaddy,他们给了我一个问题,这是可以理解的。我想知道是否有更好的方法来重写这个查询,我必须让它变得资源友好:
SELECT count(*) as count
FROM 'aaa_db'
WHERE 'callerid' LIKE '16602158641' AND 'clientid'='41'我有100多万行,并且有副本,因此我写了一个小脚本来输出副本并删除它们,而不是更改表等。
请帮帮忙。
发布于 2012-04-17 08:00:47
在clientid和callerid上使用单独的索引会导致MySQL只使用一个索引,或者在某些情况下,尝试索引合并(MySQL 5.0+)。这两种方法的效率都不如使用多列索引。
在callerid和clientid列上创建多列索引将减少CPU和磁盘IO资源(无表扫描),但是会增加磁盘存储和内存使用率。我想你可以试一试,看看Godaddy是不是更喜欢那个。
发布于 2012-04-17 08:06:58
我要尝试的第一件事,是确保您在clientid列上有一个索引,然后重写您的查询以首先查找clientid,这应该会从加速查询的考虑中删除行。此外,正如Marcus所说,添加多列索引会更快,但请记住在mysql从左到右读取索引时将其添加为(clientid,callerid)。
SELECT count(*) as count
FROM aaa_db
WHERE clientid = 41 and callerid LIKE '16602158641';注意,我删除了clientid值中的引号,因为它应该是int数据类型,如果不是,转换为int数据类型也应该更快。此外,我不确定为什么要在没有通配符的情况下执行LIKE,如果可以将其更改为也会有帮助的=的话。
发布于 2012-04-17 08:23:15
我喜欢马库斯的回答,但我会先在callerid上尝试单个索引,因为对于像16602158641这样的值,一百万行中能有多少行匹配呢?不是很多,因此单索引可以与双索引的性能相当,甚至超过双索引的性能。
另外,删除LIKE并使用=
SELECT count(*) as count
FROM aaa_db
WHERE callerid = '16602158641' -- equals instead of like
AND clientid = '41'https://stackoverflow.com/questions/10183198
复制相似问题