我在使用MySQL的共享主机上有一个搜索引擎。这个搜索引擎可能有数百万/万亿等记录。
每次执行搜索时,我都会返回记录的计数,然后可以将这些记录用于分页目的。
计数告诉您有多少结果与执行搜索有关。我相信MySQL数量很慢。
搜索查询顺序:
我没有执行PHP计数,因为在较大的数据集中这会慢得多。
问题是,我是否需要担心MySQL“数量”,我应该在什么阶段担心它。大型搜索引擎如何执行此任务?
答案 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()
函数......这应该是非常活泼的。
答案 3 :(得分:-1)
由于您使用的是PHP,因此您可以使用mysql_num_rows
方法在查询完成后告诉您计数。见这里:http://www.php.net/manual/en/function.mysql-num-rows.php