当前位置: 首页 > 面试题库 >

MySQL:计算行数的最快方法

吴展
2023-03-14
问题内容

在MySQL中,哪种方式计算行数应该更快?

这个:

SELECT COUNT(*) FROM ... WHERE ...

或者,替代方案:

SELECT 1 FROM ... WHERE ...

// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()

有人会认为第一种方法应该更快,因为在内部确定类似情况时,这显然是数据库领域,而数据库引擎应该比其他任何人都要快。


问题答案:

当您COUNT(*)使用count列索引时,它将是最好的结果。使用 MyISAM 引擎的Mysql
实际上存储行数,每次尝试对所有行进行计数时,它都不会对所有行进行计数。(基于主键的列)

使用PHP计数行不是很聪明,因为您必须将数据从mysql发送到php。当您可以在mysql端实现相同功能时,为什么要这样做呢?

如果COUNT(*)速度较慢,则应EXPLAIN在查询上运行,并检查是否确实使用了索引以及应将索引添加到何处。

以下不是 最快的 方法,但是在 某些 情况下,这COUNT(*)并不完全适合-
在开始对结果进行分组时,您可能会遇到问题,即COUNT实际上并没有计算所有行。

解决方法是SQL_CALC_FOUND_ROWS。通常在选择行但仍需要知道总行数(例如,用于分页)时使用。选择数据行时,只需SQL_CALC_FOUND_ROWS在SELECT之后附加关键字:

SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;

选择所需的行后,可以通过以下单个查询获取计数:

SELECT FOUND_ROWS();

FOUND_ROWS() 必须在数据选择查询后立即调用。

总之,实际上,一切都取决于您有多少个条目以及WHERE语句中的内容。当有很多行(数万,数百万甚至更多)时,您应该真正注意索引的使用方式。



 类似资料:
  • 问题内容: 我有一个Python列表,我想知道在此列表中计算项目出现次数的最快方法。在我的实际情况下,该项目可能会发生数万次,这就是为什么我想要一种快速的方法。 哪种方法:或更优化? 问题答案: a = [‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘2’, ‘2’, ‘2’, ‘2’, ‘7’, ‘7’, ‘7’, ‘10’, ‘10’] print a.count(“1”) 它

  • 问题内容: 出于说明目的,假设您正在使用带有三列的简单MySQL“ books”表运行一个库: (ID,标题,状态) id 是主键 书名 是书的标题 status 可以是描述书籍当前状态的枚举(例如,Available,Checkedout,Processing,MISSING) 一个简单的查询来报告每种状态下有多少本书: 或专门查找有多少本书: 但是,一旦表增长到数百万行,这些查询将花费几秒钟来

  • 问题内容: 我正在使用Hibernate检索特定查询的行数。假设我有一个名为“ Person”的表,其中包含各种列。这些列之一是“名称”。 如果我想获得带有“安德鲁”名字的人数,以下哪种方法最有效?假设某些/全部之间存在性能差异。使用Hibernate / SQL是否有更好的方法? (1)选择所有列 (2)仅选择名称列 (3)在查询中使用Count (4)在查询中的名称列中使用Count 编辑:对

  • 问题内容: 在没有应用任何条件的情况下,对表中的行总数进行计数的最佳MySQL命令是什么?我正在通过php执行此操作,所以也许有一个php函数可以为我执行此操作?我不知道。这是我的php的示例: 问题答案:

  • 问题内容: 我有这个MySQL查询: 返回如下内容: 我真正想要的是末尾的另一列以显示运行总计: 这可能吗? 问题答案: 也许对您来说是一个更简单的解决方案,并且可以防止数据库不得不执行大量查询。这仅执行一个查询,然后在一次通过中对结果进行一些数学运算。 这将为您提供一个额外的RT(运行总计)列。不要错过顶部的SET语句来首先初始化运行中的total变量,否则您将只获得一列NULL值。

  • 问题内容: 用MySQL计算中位数的最简单方法(希望不是太慢)是什么?我一直在寻找均值,但是我很难找到一种简单的计算中位数的方法。现在,我将所有行返回给PHP,进行排序,然后选择中间行,但是肯定必须有一个简单的方法可以在单个MySQL查询中完成。 示例数据: 排序给出,因此中位数应为,而其中== 。 问题答案: 在MariaDB / MySQL中: 史蒂夫·科恩(Steve Cohen)指出,在第