Php 优化sql选择嵌套式where查询

Php 优化sql选择嵌套式where查询,php,mysql,sql,database,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

因为我是初学者,我需要知道一件事。 我在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进行这些连接。

我认为只知道一件事是不够的。这可能可以通过简单的连接来解决:你能给我们展示一下SQL,而不是用PHP生成的字符串。@scragar谢谢…编辑了我的问题。非常感谢你真的帮了我很多…但实际上我不知道索引的概念谢谢我会学习的quickly@scragar:注意
的优先级,您的语句与原始语句不同。如果OP query中最后一个
后面的谓词为TRUE,则其他谓词都不重要。您的查询似乎在
下重新定位了该
,这与原始查询不同。(这很可能是OP的意图,但它并不等同于最初的查询。)@spencer7593他发布的查询有一个不均匀的开始/结束括号,我尽了我所能,甚至通过在顶部张贴我重新整理的问题副本来显示我的工作来源,从而确保我的工作来源是显而易见的。如果对结束括号的位置有错误的假设,我欢迎他解释一下,我会修正它,直到那时这是一个最好的猜测。@user3496195索引实际上是一个非常简单的概念,只要把它们想象成一本书的目录或词汇表,当你想查找一些你不需要查看每一页的内容时,你看目录或词汇表,看看它在书中的位置,然后只看相关的页面。对于MySQL,这是一个索引,当您搜索某个内容时,如果where子句是index'd,它将使用该索引来确定要查看的行,而不是检查每一行。@scragar:原始帖子在最后一行或之前有两个结束行。当SQL从PHP代码中移出时,编辑时一个参数消失了。(问题已经结束,所以我无法将我的答案发布。)