0

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

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

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

请帮忙。

4

3 回答 3

4

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

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

于 2012-04-17T00:00:46.517 回答
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没有通配符运算符的情况下进行操作,如果您可以将其更改为=也会有所帮助。

于 2012-04-17T00:06:57.647 回答
1

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

另外,删除LIKE并使用=

SELECT count(*) as count
FROM aaa_db
WHERE callerid = '16602158641' -- equals instead of like
AND clientid = '41'
于 2012-04-17T00:23:14.530 回答