依靠Bigest表格

时间:2011-09-15 15:17:45

标签: php mysql sql

我的问题是当我尝试获取咨询的COUNT时返回大量记录(例如500.000):

示例:

$limit = ' LIMIT 0,30';
$ResultQuery = mysql_query("
    SELECT id, name, description, date 
    FROM products 
    WHERE name 
    LIKE 'dog%'".$limit);

$CountQuery = mysql_query("
    SELECT COUNT(id) 
    FROM products 
    WHERE name LIKE 'dog%'");

while ($Product = mysql_fetch_assoc($ResultQuery)) { [...]

注意:使用COUNT(id)比使用$ ResultQuery的mysql_num_rows更快(在我的情况下)。

如果我看到使用MySQL管理员在做什么服务器,我会看到3秒查询1º查询(限制),1秒钟“发送数据”,以及143秒“发送2º查询数据”。

我阅读了更多关于此问题的文章,因为要获取查询计数,需要扫描查询的所有行(没有限制)。

不存在绕过此问题的任何方法或模式?提取具有大量结果的行数的任何方法?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我最好的选择是你没有正确设置索引。从它的外观来看,你还没有为你的name字段设置一个合适的索引,这导致MySQL遍历每一行(超过22 000 000)以寻找'dog%'

我建议您尝试使用常规索引并对结果进行基准测试

CREATE INDEX `idx_name` ON products (name)

答案 1 :(得分:0)

  

id | select_type |表|类型| possible_keys |关键| key_len | ref |行|额外   
1 |简单|产品|所有|名字| NULL | NULL | NULL | 22160980 |使用何处

从上面可以看出,索引“name”未被使用。原因如下。

您在名称列上使用全文索引,该索引仅对全文搜索查询有用 http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

如果您不进行任何全文搜索,请删除该索引并按照上面的建议创建另一个索引

  

CREATE INDEX idx_name ON产品(名称)

这将在名称上创建一个BTREE索引,然后将在您的搜索查询中使用该索引。请注意,如果您在开头使用'%'执行类似查询,则此索引将无用。例如

  

SELECT count(id)FROM products WHERE name LIKE'%dogs'

不会使用索引。

答案 2 :(得分:-1)

$count =  mysql_num_rows($ResultQuery);