Php 在mysql中的一个查询中选择行和总计数
假设我有一个表t,表t有15000个条目 假设查询Php 在mysql中的一个查询中选择行和总计数,php,mysql,sql,select,Php,Mysql,Sql,Select,假设我有一个表t,表t有15000个条目 假设查询 SELECT * FROM t WHERE t.nid <1000 SELECT*FROM t WHERE t.nid您可以尝试SQL\u CALC\u FOUND\u ROWS,这样可以在不再次运行语句的情况下获得总记录数 SELECT SQL_CALC_FOUND_ROWS * FROM t WHERE t.nid <1000 LIMIT 10; -- get records SELECT FOUND_ROWS();
SELECT * FROM t WHERE t.nid <1000
SELECT*FROM t WHERE t.nid您可以尝试SQL\u CALC\u FOUND\u ROWS
,这样可以在不再次运行语句的情况下获得总记录数
SELECT SQL_CALC_FOUND_ROWS * FROM t WHERE t.nid <1000 LIMIT 10; -- get records
SELECT FOUND_ROWS(); -- get count
SELECT SQL\u CALC\u FOUND\u ROWS*FROM t WHERE t.nid最快的方法是使用SQL\u CALC\u FOUND\u ROWS和两个查询
SELECT SQL_CALC_FOUND_ROWS * FROM t WHERE t.nid <1000 LIMIT 10
SELECT FOUND_ROWS()
从t中选择SQL\u CALC\u FOUND\u ROWS*,其中t.nid UPDATE:SQL\u CALC\u FOUND\u ROWS被认为是有害的
首先,该函数是不可移植的(它是一个MySQL扩展),将被删除。正如user@Zveddochka指出的,MySQL 8.0.17中已经不推荐使用它
但事实证明,如果使用适当的索引,那么运行两个查询实际上会更快。SQL\u CALC\u FOUND\u ROWS
指令是通过“虚拟扫描”实现的,该扫描会产生额外的恢复成本。如果查询未编制索引,则此成本将与COUNT()
相同,因此运行两个查询的成本将增加一倍,即使用SQL\u CALC\u FOUND\u ROWS
将使运行速度加快50%
但是当查询被正确索引时会发生什么呢。事实证明,不仅COUNT()
非常快,因为它只访问元数据和索引,而且没有SQL\u CALC\u FOUND\u ROWS
的查询速度更快,因为它不会产生任何额外的成本两个查询组合的成本小于增强的单个查询的成本:
SQL\u CALC\u FOUND\u行的结果如下:对于每个b值
无缓存执行需要20-100秒,预热后需要2-5秒。这样的
差异可以通过此查询所需的I/O来解释
–mysql无限制地访问此查询可能产生的所有10k行
条款
结果如下:运行此查询需要0.01-0.11秒
所有连续运行的第一次和0.00-0.02秒
因此,我们可以看到,SELECT+COUNT(0.00-0.15秒)的总时间非常长
小于原始查询的执行时间(2-100秒)。让我们休息一下
看看你的解释
那么,该怎么办
// Run two queries ensuring they satisfy exactly the same conditions
$field1 = "Field1, Field2, blah blah blah";
$field2 = "COUNT(*) AS rows";
$where = "Field5 = 'X' AND Field6 = 'Y' AND blah blah";
$cntQuery = "SELECT {$field2} FROM {$joins} WHERE {$where}";
$rowQuery = "SELECT {$field1} FROM {$joins} WHERE {$where} LIMIT {$limit}";
现在,第一个查询返回计数,第二个查询返回实际数据
旧答案
你可以,但我认为这将是一个性能杀手
您最好的选择是使用SQL\u CALC\u FOUND\u ROWS
子句并发出第二个查询来恢复它
SELECT SQL_CALC_FOUND_ROWS * FROM t WHERE t.nid <1000 LIMIT 10;
SELECT FOUND_ROWS();
从t中选择SQL\u CALC\u FOUND\u ROWS*,其中t.nid听起来像是您想要的
SELECT SQL\u CALC\u FOUND\u ROWS*FROM t WHERE t.nid从MySQL 8.0.17开始,SQL\u CALC\u FOUND\u ROWS查询修饰符和附带的FOUND\u ROWS()函数已被弃用,并将在未来的MySQL版本中删除。
SELECT SQL_CALC_FOUND_ROWS * FROM t WHERE t.nid <1000 LIMIT 10;
SELECT FOUND_ROWS();
SELECT SQL_CALC_FOUND_ROWS * FROM t WHERE t.nid <1000 LIMIT 10;
SELECT FOUND_ROWS();