Php 优化sql选择嵌套式where查询
因为我是初学者,我需要知道一件事。 我在php中有一个这样的查询..此查询的最佳性能实现是什么: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
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代码中移出时,编辑时一个参数消失了。(问题已经结束,所以我无法将我的答案发布。)