由于花费太多时间,无法在 CodeIgniter 3 中加载数据及其计数

Cannot load data and its count in CodeIgniter 3 because of taking too much time

提问人:Prido1024 提问时间:11/13/2023 最后编辑:Prido1024 更新时间:11/13/2023 访问量:80

问:

我的网站中有一个页面,其中显示了一个包含数据总数的数据表。可以在表中筛选数据,筛选数据时,计数可能会更改以匹配正在筛选的数据。数据是从 Oracle DB 视图获取的,其中有 20000+,但该表仅显示前 10 个数据。

为了显示计数和数据本身,我使用了数据模型中的 2 个独立方法,让我们将它们称为 和 。在控制器的方法中,首先被调用并返回数据的计数,然后被调用并返回 10 个要显示的数据。count_dataget_datacount_dataget_data

<?php
class Record extends CI_Controller
    // ...
    function show_table() {
        // ...
        $recordCount = $this->record_model->count_data(/* arguments */);
        // ...
        $recordData = $this->record_model->get_data(/* arguments */);
        // ...
    }
    // ...
}

问题是,每次我尝试加载页面时,数据都不会加载。它只会在 20 秒内返回有关互联网连接的错误消息。当我尝试修改以返回硬编码值时,它起作用了,但即使是数据也需要大约 20 秒才能加载。count_data

我尝试了很多方法来使我的数据加载到我的页面中。我尝试在system/core/CodeIgniter.php的脚本中添加此脚本

if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
{
    @set_time_limit(300);
}

我已经在我的控制器上添加了 和。我也遵循了这个答案,像这样更改了 CodeIgniter 的查询ini_set('max_execution_time',0)set_time_limit(0)

        $this->load->database();
        $this->db->from($this->view);
        $count = $this->db->count_all_results();
        $this->db->close();
        return $count;

像这样原生

        $this->load->database();
        $result = $this->db->query($query)->result_array();
        $count = $result[0]["TOTAL"];
        $this->db->close();
        return $count;

但它一直在失败。它仍然在 20 秒内返回错误并且没有数据。

请帮帮我,我的解决方案用完了。

编辑:

我怀疑这与以下事实有关:

  • 它有 79 列。
  • 它不是具体化视图,因此无法编制索引。

这是因为数据库中还有其他视图和表的行数比我的视图多,但其数据的获取速度要快得多,不到 5 秒。视图的列数最多是我视图的 1/2,而表有索引。

php codeigniter

评论

1赞 mickmackusa 11/13/2023
当您在 CI 之外(在首选的 RDBMS 中)运行 SQL 时,它需要多长时间?架构中是否有最佳索引?是不是时间更重要,而是记忆?此表中是否有非常大量的数据(该表的行数没有高得离谱)?
0赞 Prido1024 11/13/2023
@mickmackusa CI 之外需要 10 秒。也很抱歉在问题中说错了,数据实际上来自(非物化)视图,而不是表格,因此无法索引。该视图有 79 列。
0赞 mickmackusa 11/13/2023
您正在对数据库进行两次访问。如果隔离行计数查询会怎样?如果您只是调用控制器,它会解决吗?exit($this->record_model->count_data(......));
0赞 Prido1024 11/13/2023
喜欢这个? 不,它无法解决。$recordCount = exit($this->record_model->count_data(/* arguments */));
0赞 mickmackusa 11/13/2023
我不希望您加载视图或任何东西。无需将返回的模型值保存到变量中。 将回显返回值并从该点终止执行。我想知道您的模型是否真的可以计算视图表中的总行数。您的日志中是否有任何错误?我们还应该包括一些健全性检查,例如打印出所有假定正确填充的变量。我不知道我是否认可视图表的变量命名作为类对象......这看起来像是与 CI 命名约定冲突的良好候选者。exit()$this->view

答: 暂无答案