首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更好地查询Select Count Where

问更好地查询Select Count Where
EN

Stack Overflow用户
提问于 2012-04-17 07:43:33
回答 3查看 1.6K关注 0票数 0

我被托管在Godaddy,他们给了我一个问题,这是可以理解的。我想知道是否有更好的方法来重写这个查询,我必须让它变得资源友好:

代码语言:javascript
复制
SELECT count(*) as count
FROM 'aaa_db'
WHERE 'callerid' LIKE '16602158641' AND 'clientid'='41'

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

请帮帮忙。

EN

回答 3

Stack Overflow用户

发布于 2012-04-17 08:00:47

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-17 08:06:58

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

代码语言:javascript
复制
SELECT count(*) as count
FROM aaa_db
WHERE clientid = 41 and callerid LIKE '16602158641';

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-17 08:23:15

我喜欢马库斯的回答,但我会先在callerid上尝试单个索引,因为对于像16602158641这样的值,一百万行中能有多少行匹配呢?不是很多,因此单索引可以与双索引的性能相当,甚至超过双索引的性能。

另外,删除LIKE并使用=

代码语言:javascript
复制
SELECT count(*) as count
FROM aaa_db
WHERE callerid = '16602158641' -- equals instead of like
AND clientid = '41'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10183198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档