问题描述
根据另一位开发人员在 stackoverflow 上的建议,我更新了我的查询如下,但我仍然需要进一步优化它。有人可以指导我如何最好地将索引应用于查询。
见下面的查询:
SELECT a.id,a.user_unique_id,a.loan_location,a.ippis,a.tel_no,a.organisation,a.branch,a.loan_agree,a.loan_type,a.appr,a.sold,a.loan_status,a.top_up,a.current_loan,a.date_created,a.date_updated,c.loan_id,c.user_unique_id AS tu_user_unique_id,c.ippis AS tu_ippis,c.top_up_approved,c.loan_type AS tu_loan_type,c.dse,c.status,c.current_loan AS tu_current_loan,c.record_category,c.date_created AS tu_date_created,c.date_updated AS tu_date_updated
FROM loan_applications_tbl a
LEFT JOIN topup_or_reapplication_tbl c
ON a.ippis=c.ippis
WHERE ((c.status IN ('pending','corrected','Rejected','Processing','Captured','Reviewed','top up')
AND MONTH(CURRENT_DATE) IN (MONTH(c.date_created),MONTH(c.date_updated)
AND YEAR(CURRENT_DATE) IN (YEAR(c.date_created),YEAR(c.date_updated))
AND c.current_loan='1' ))
OR ( a.loan_status IN ('pending','top up')
AND MONTH(CURRENT_DATE) IN (MONTH(a.date_created),MONTH(a.date_updated)) )
AND YEAR(CURRENT_DATE) IN (YEAR(a.date_created),YEAR(a.date_updated))
AND (a.current_loan='1'
OR (a.current_loan='0'
AND a.loan_status IN('Approved','Closed')))))
执行时间:53s
记录数:11000
使用mysql EXPLAIN给出如下截图:(如何最大化可能的keys列中的信息
我已更新以下附加信息:
我在 c 和 a 之间使用 OR 的原因如下:
-
a
是具有 66 列的父表,如果a
上的新条目具有匹配/现有的ippis
({{ {1}})a
中的某些列被新条目中的数据更新/覆盖,而条目中的剩余数据作为新行插入a
(c
不是在表ippis
中唯一)。这是为了保留所有后续贷款请求的历史记录,同时不为冗余留出空间 -
在检索记录时,我需要大
c
子句使我能够检查OR
和a
表的每个贷款记录的所有实例,其中c
列与我的 WHERE 子句中的参数匹配。 -
status,date and current_loan
中总是会有完整的记录,但a
中不会总是有记录,除非有更多的贷款请求需要相同的唯一 ID。c
包含“谁是帐户人,例如通过唯一 ID”,以及第一笔贷款的附加/补充状态详细信息,随后,在第一笔贷款之后,“c”将是附加/补充状态具有相同唯一 ID 的实际贷款申请的详细信息。 -
如果 "A" 是在 3 月 12 日创建的,并且在 3 月 16 日创建了一个新的 "c" 记录。 "A" 记录也会得到最后更新的标记为 3 月 16 日的记录,因为它有一个孩子,而新的
a
记录有它自己创建和更新的时间戳。c
记录的 Updated 字段将为空/空,直到进行更改或存在a
记录,c
记录的 Updated 字段将为空/空,直到有一些更改制作成c
条记录
我希望这是可以理解的
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)