【问题标题】:Mysql query is taking too long to loadMysql 查询加载时间过长
【发布时间】:2020-10-10 05:42:39
【问题描述】:

我在我的项目中使用 Codeigniter,在我的数据库表中有一些 TEXT 数据类型的列。我意识到用 TEXT 数据类型加载这些列需要很长时间才能加载。

我的测试结果: 这些是 TEXT 数据类型列 - tc_status_1、tc_status_2、tc_status_3、tc_status_4、unconfirmation_status、tc_rejected_status、tc_restore_status、tc_confirmation_status

这是我的 CI 代码,运行时间太长,运行时间可能超过 20 分钟。

$this->db->select('application_id, tbl_application.first_name, tbl_application.middle_name, tbl_application.last_name, tbl_application.gender, admission_no, tbl_application.phone, tc_sent, tc_sent_1, tc_status_0, tc_status_1, tc_status_2, tc_status_3, tc_status_4, tc_application_status, tc_admission_status, is_confirmed, confirmation_status, confirmation_code, unconfirmation_status, tc_rejected_status, tc_restore_status, tc_confirmation_status, tc_verification_status, tc_transfer_status, programme_name, tc_code, form4_index, registration_status');
        $this->db->from('tbl_application');
        $this->db->join('tbl_academic_info', 'tbl_academic_info.applicant_id=application_id AND tbl_academic_info.status="0"');
        $this->db->join('tbl_admission', 'tbl_admission.applicant_id=tbl_application.application_id AND tbl_admission.status="0"');
        $this->db->join($this->db_name.'.tbl_programme', 'tbl_programme.programme_code=tbl_admission.program_of_study AND tbl_programme.status="0"');
        $this->db->where('tbl_application.branch', $branch);
        $this->db->where('tbl_application.academic_year', $entry_year);
        $this->db->where('tbl_application.admission_status', '1');
        $this->db->where('tbl_application.status', '0');

这段代码运行得更快。

        $this->db->select('application_id, tbl_application.first_name, tbl_application.middle_name, tbl_application.last_name, tbl_application.gender, admission_no, tbl_application.phone, tc_sent, tc_sent_1, tc_status_0, tc_application_status, tc_admission_status, is_confirmed, confirmation_status, confirmation_code, tc_verification_status, tc_transfer_status, programme_name, tc_code, form4_index, registration_status');
        $this->db->from('tbl_application');
        $this->db->join('tbl_academic_info', 'tbl_academic_info.applicant_id=application_id AND tbl_academic_info.status="0"');
        $this->db->join('tbl_admission', 'tbl_admission.applicant_id=tbl_application.application_id AND tbl_admission.status="0"');
        $this->db->join($this->db_name.'.tbl_programme', 'tbl_programme.programme_code=tbl_admission.program_of_study AND tbl_programme.status="0"');
        $this->db->where('tbl_application.branch', $branch);
        $this->db->where('tbl_application.academic_year', $entry_year);
        $this->db->where('tbl_application.admission_status', '1');
        $this->db->where('tbl_application.status', '0');

请大家推荐!我该如何处理才能让我的代码运行得更快...

【问题讨论】:

  • 这些 TEXT 列中究竟存储了什么?它们似乎都有像 X_status_X 这样的名称,我希望它们的值非常短,但您的问题似乎表明它们拥有大量数据
  • 另外,第二个到底快多少?
  • X_status_X 可以保存很长的描述
  • 第二个可能只需要几秒钟就可以完成,不会超过5到6秒
  • 除此之外,任何时候您发现自己有枚举列名(例如,2),您都可以有理由相信您的架构设计是次优的。考虑是否可以将状态放在单独的表中,例如状态(id,tc_id,状态)

标签: php mysql codeigniter


【解决方案1】:
  1. 使用索引
  2. 通过您的代码,您似乎正在填充项目列表,添加查看详细信息按钮/链接以获取应用程序的详细信息。仅获取列表的非常必要列。当用户点击查看详细信息时,可以显示其他文本数据。新查询将仅获取 1 个应用程序的所有文本,而不是所有列表
  3. 重新考虑您的数据库设计,对于我认为是叙述的所有状态,使用应用程序的外键创建一个新表

【讨论】:

  • 我同意 Jawwad Ahmad 的观点。为了提高查询的性能,您必须考虑以下几点。 1. 只获取必要的列。 2. 索引列使性能更好。 3.尝试创建Pivot表来维护表之间的关系。 4. 如果您要存储到数据库中的数据没有长值,则使用另一种数据类型。我想推荐请阅读更多关于 MySQL 数据类型以及数据透视表概念的信息。
  • @JerrySam 如果这解决了您的问题,请将答案标记为已接受。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2017-07-12
  • 2018-06-23
  • 1970-01-01
相关资源
最近更新 更多