大型数据库的计数替代方案

问题描述 投票:0回答:2

编辑:无论我做什么,计数似乎都不起作用。我正在考虑一种不同的计数方式,我使用某种 SQL 查询来重新编译所有行 id。

我的意思是什么? 示例数据库:

ID - First Name
----------------
1 - John
3 - Joe
4 - Sal
9 - Murry

看到它跳过了 2,5,6,7,8,因为这些行已被删除。是否可以重置所有当前行 ID 并自动递增它们?如果是这样,那么我可以这样做:

SELECT id FROM table ORDER BY id DESC LIMIT 1
,这应该需要几秒钟,如果我不删除任何记录,它也应该非常精确。


Count(*)
在我的数据库上运行速度非常慢,大约有 800'000 行。

几乎所有时候我都无法加载页面。 有没有更快的替代方案?

Count(1)
没有区别。

这是我的 PHP:

这是计数功能:

//Create a new function named query;
function countrows($sql = false,$dbname = false,$obj = false) {

    //Prepare The SQL Query;
    $query = Connect('localhost','shinymk_admin','password',$dbname)->prepare($sql);

    $res = true;

    //Execute Binded Query;
    try { $query->execute(); $count = $query->fetch(PDO::FETCH_NUM); }

    catch (PDOException $e) {

        $count = false;

    }

    //If no errors happened Make $row true;
    return $count[0];

}
mysql count
2个回答
3
投票

事情的真相是这样的

  COUNT(*) AS rowcount FROM table

是获得准确行数的最快方法。另一方面,如果您使用

 COUNT(some_column) AS rowcount FROM table

它将计算具有非 NULL 列值的行数。这可能但不一定是愚蠢的全表扫描慢。

如果您碰巧使用 MyISAM 访问方法,

COUNT(*)
应该非常快,因为该访问方法会跟踪计数。 如果你使用 InnoDB,它不会那么快。 但 800K 条记录并不是很多。

您可能会从中受益

 OPTIMIZE TABLE table

在这种情况下,

COUNT(*)
非常慢。


0
投票

优化表 给我带来了巨大的改变 谢谢谢谢

© www.soinside.com 2019 - 2024. All rights reserved.