我的问题是当我尝试获取咨询的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º查询数据”。
我阅读了更多关于此问题的文章,因为要获取查询计数,需要扫描查询的所有行(没有限制)。
不存在绕过此问题的任何方法或模式?提取具有大量结果的行数的任何方法?
感谢您的帮助。
答案 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);