php - 优化 sql select 嵌套 where 查询

标签 php mysql sql database

<分区>

因为我是初学者,所以我需要知道一件事。 我在 php 中有一个这样的查询..这个查询的最佳性能实现是什么:

    select Sub_Code,Sub_Name from subj_mast where Dept_id=
       (select Dep_Id from academic where Reg_No=$reg)
       and Sem='$sem' and (Sub_Type='core' or subj_mast.Sub_Code=
(select Elective_code from elective where Reg_No=$reg and Sem='$sem'))
        or subj_mast.Sub_Code
      (select Sub_Code from history_of_arrear where Reg_No=$reg)

实际上这个查询工作得很好,但我认为这会使检索变慢.. 帮我解决这个...

最佳答案

好的,经过一些重新安排后,我尽我所能清理并构建了 SQL:

SELECT
    Sub_Code,
    Sub_Name
FROM subj_mast
WHERE
    Dept_id = (
        SELECT
            Dep_Id
        FROM academic
        WHERE
            Reg_No=$reg
    )
    AND
    Sem='$sem'
    AND (
        Sub_Type='core'
        OR
        subj_mast.Sub_Code=(
            SELECT
                Elective_code
            FROM elective
            WHERE
                Reg_No=$reg
                AND
                Sem='$sem'
        )
    )
    OR
    subj_mast.Sub_Code = (
        SELECT
            Sub_Code
        FROM history_of_arrear
        WHERE
            Reg_No=$reg
    )

在将子查询移动到连接中并在不访问数据库和数据的测试副本的情况下尽我所能优化它们之后,这就是我想出的:

SELECT
    S.Sub_Code,
    S.Sub_Name
FROM subj_mast S
LEFT JOIN academic A
  ON A.Dep_id = S.Dept_Id

LEFT JOIN history_of_arrear H
  ON H.Sub_Code = S.Sub_Code
     AND
     H.Reg_No=A.Reg_No

LEFT JOIN Elective_code E
  ON E.Sub_Code = S.Sub_Code
     AND
     E.Reg_No=$reg
     AND
     E.Sem='$sem'

WHERE
    S.Sem='$sem'
    AND
    A.Reg_No=$reg
    AND (
        S.Sub_Type='core'
        OR
        E.Sub_Code IS NOT NULL
    )
    OR
    H.Sub_Code IS NOT NULL

您应该创建以下索引:

CREATE INDEX idx_subjMas_dept_sem ON subj_mast(Dept_Id, Sem);
CREATE INDEX idx_academic_dep_regNo ON academic(Dep_id, Reg_No);
CREATE INDEX idx_historyOfArrear_subCode_regNo ON history_of_arrear(Sub_Code, Reg_No);
CREATE INDEX idx_ElectiveCode_sem_subCode_regNo ON history_of_arrear(Sem, Sub_Code, Reg_No);

应该协助 MySQL 进行这些连接。

关于php - 优化 sql select 嵌套 where 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24410788/

相关文章:

sql - 更改序列以链接到另一个表

mysql - 数据库关系 外键的直接引用与间接引用

php - 从特定页面重定向已注销的用户

mysql - SQL,如何将一个表的所有行插入到另一个表中

PHP 表单无法通过 GET 和 POST 方法传递少量值

php - 使用php同步不同数据库中的相同表

mysql - 预订系统删除一段时间内所有保存的预订

sql - 我应该如何设计我的 table

php - Kohana 中的常量

php mysql_fetch_array 每 25 个项目包装一个 div