什么是计算MySQL记录的最佳方法

时间:2011-09-21 15:12:11

标签: php mysql

我在使用MySQL的共享主机上有一个搜索引擎。这个搜索引擎可能有数百万/万亿等记录。

每次执行搜索时,我都会返回记录的计数,然后可以将这些记录用于分页目的。

计数告诉您有多少结果与执行搜索有关。我相信MySQL数量很慢。

搜索查询顺序:

  1. 已执行搜索并返回结果
  2. 执行计数查询
  3. 我没有执行PHP计数,因为在较大的数据集中这会慢得多。

    问题是,我是否需要担心MySQL“数量”,我应该在什么阶段担心它。大型搜索引擎如何执行此任务?

4 个答案:

答案 0 :(得分:5)

在几乎所有情况下,答案都是索引。数据库越大,设计和优化的索引策略就越重要。

对大型数据库建立索引的重要性不容小觑。

对于不在代码中循环来计算DB记录,你是绝对正确的。您的RDBMS针对此类操作进行了优化,您的编程语言是否定的。只要有可能,您希望在RDBMS提供的SQL语言中进行任何排序,分组,计数和过滤操作。

至于有效地获取使用LIMIT子句的“分页”查询的计数,请查看SQL_CALC_FOUND_ROWS

  

SQL_CALC_FOUND_ROWS告诉MySQL计算会有多少行   在结果集中,忽略任何LIMIT条款。的数量   然后可以使用SELECT FOUND_ROWS()检索行。见章节   11.13,“信息功能”。

答案 1 :(得分:2)

如果MySQL数据库达到数百万条记录,那么您将被迫停止使用单片数据存储 - 这意味着您必须拆分读取,写入并且很可能使用与默认存储引擎不同的存储引擎。

一旦发生这种情况,您将停止使用实际的行数,然后您将开始使用估算值,缓存搜索结果等,以减轻数据库的工作量。甚至谷歌也使用缓存并显示记录数量的估计值。

无论如何,目前,你有两个选择:

1 - 运行2个查询,一个用于检索数据,另一个用于使用COUNT()来获取行数。

2 - 使用像@JohnFX建议的SQL_CALC_FOUND_ROWS。

Percona has an article about what's faster,现在可能已经过时了。

您面临的最大问题是the way MySQL uses LIMIT OFFSET,这意味着您可能不希望您的用户使用较大的偏移数字。

如果您确实获得了数百万条记录 - 我并不认为您在共享服务器上的MySQL单片存储的光明前景。但是,祝你和你的项目好运。

答案 2 :(得分:0)

如果我理解你正在尝试做什么,你可以执行一个查询,并在PHP中对结果执行mysql_num_rows()函数......这应该是非常活泼的。

http://php.net/manual/en/function.mysql-num-rows.php

答案 3 :(得分:-1)

由于您使用的是PHP,因此您可以使用mysql_num_rows方法在查询完成后告诉您计数。见这里:http://www.php.net/manual/en/function.mysql-num-rows.php