Php 什么';这是计算MySQL记录的最佳方法

Php 什么';这是计算MySQL记录的最佳方法,php,mysql,Php,Mysql,我在使用MySQL的共享主机上有一个搜索引擎。这个搜索引擎可能有数百万/万亿的记录 每次执行搜索时,我都返回一个可用于分页目的的记录计数 计数告诉您执行的搜索有多少个结果。我认为MySQL的计数相当慢 搜索查询的顺序: 执行搜索并返回结果 已执行计数查询 我不执行PHP计数,因为在较大的数据集中,这将慢得多 问题是,我需要担心MySQL的“计数”吗?在什么阶段我应该担心它。大型搜索引擎是如何执行此任务的?因为您使用的是PHP,所以可以使用mysql\u num\u rows方法在查询完成后告诉您

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

每次执行搜索时,我都返回一个可用于分页目的的记录计数

计数告诉您执行的搜索有多少个结果。我认为MySQL的计数相当慢

搜索查询的顺序:

  • 执行搜索并返回结果
  • 已执行计数查询
  • 我不执行PHP计数,因为在较大的数据集中,这将慢得多


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

    因为您使用的是PHP,所以可以使用
    mysql\u num\u rows
    方法在查询完成后告诉您计数。请参见此处:

    如果我了解您正试图正确执行的操作,您可以执行一个查询,并在PHP中对结果执行
    mysql\u num\u rows()
    函数。。。那应该很有活力


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

    在大型数据库上建立索引的重要性怎么强调都不为过

    关于不在代码中循环计数DB记录,您是绝对正确的。您的RDBMS针对这样的操作进行了优化,您的编程语言是no。只要可能,您都希望在RDBMS提供的SQL语言中执行任何排序、分组、计数和过滤操作

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

    SQL\u CALC\u FOUND\u ROWS告诉MySQL计算将有多少行 在结果集中,不考虑任何限制条款。人数 然后可以使用SELECT FOUND_rows()检索行。见第节 11.13,“信息功能”


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

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

    无论如何,目前,您有两种选择:

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

    2-使用SQL\u CALC\u FOUND\u行,如@JohnFX建议的

    ,虽然现在可能已经过时了

    您面临的最大问题是,这意味着您可能不喜欢您的用户使用大偏移量



    如果您确实获得了数百万条记录,我不希望您的MySQL单片存储在共享服务器上有一个光明的未来。然而,祝你和你的项目好运。

    万亿?遗憾的是,您不必担心计数操作会很慢,但LIMIT,OFFSET并没有达到您预期的效果—它检索整个数据集,然后从OFFSET开始丢弃它,以LIMIT结束。共享主机上有万亿条记录?祝你好运你要把那个服务器碾碎。看看另一个问题的答案。你的问题不是重复的,但是那边的答案几乎涵盖了你的情况:根据Marc的评论,随着搜索引擎的增长,你会想查看负载。但你必须从某个地方开始。只要注意它,因为它的大小可以变得非常大,非常,非常快。万亿?真正地现在,对于一个真正的RDBMS和您自己的硬件,您实际有多少行,您有多少预算……您的链接是错误的。这是针对受影响的行,而不是row count.OP正在使用分页(很可能是LIMIT子句),因此此方法不会给出预期的结果。此外,它只会告诉您返回的数据中的行数,而不是查询结果的总大小(假设为分页指定了限制)@Karolis:这可能会起作用,但是,如果他是通过某种查询后方法进行分页的,这个解决方案应该对他有用。Downvoter,你想评论一下这个答案为什么没有用吗?也许我可以改进它。我真的不认为这解决了OP问题。我回答的问题是“大型搜索引擎如何执行此任务?”以及隐含的问题“如何在真正大型的数据库上快速执行此任务”。无论如何。我添加了对行计数技术的引用,以涵盖他的问题的更多宽度。@JohnFx+1是的,这是中型数据库可能的解决方案之一。但是在非常大的数据库上,
    SQL\u CALC\u FOUND\u ROWS
    会降低性能,因为它仍然需要计算所有的行。我认为最好的方法是使用基于近似的某种解决方案。非常感谢-我正在使用限制偏移搜索,因此这可能非常有用。我将检查SQL_CALC_FOUND_ROWS.OP是否使用分页,因此这不会给出所需的结果。@Karolis,您假设OP用于分页的方法是某种多查询限制方法。OP似乎在代码中使用分页,或者至少我是这么理解的。如果是向下投票,请告诉回答者您为什么要向下投票。也许答案可以这样改进。(一旦答案得到改善,否决票应该被取消。)@JonathanM Yes。我认为OP使用的是LIMIT,因为在大型数据库上查询后的解决方案会非常慢。我实际上使用的是select*并返回mysql_num_行,因为我相信select比计数快,至少几年前在postgreSQL中是这样的!目前我正在查看SQL\u CALC\u FOUND\u行。谢谢你的幸运手势。如果一切顺利,再见共享主机!