在PHP中进行大sql查询还是进行小sql查询并处理结果更快?

在PHP中进行大sql查询还是进行小sql查询并处理结果更快?,php,sql,Php,Sql,我有一个非常复杂的查询,它非常慢,在select中有很多复杂的情况 我想知道是否真的需要得到这两个表并在PHP中对它们进行逻辑处理 你需要我的全部代码才能告诉你吗?我刚刚添加了一个精选案例的示例,向您展示其复杂性 CASE WHEN (g.date_fin_contrat > :date_quittancement_max) THEN FLOOR(TIMESTAMPDIFF(month, MAX(g.date_quittancement_echeance), :date_qui

我有一个非常复杂的查询,它非常慢,在select中有很多复杂的情况

我想知道是否真的需要得到这两个表并在PHP中对它们进行逻辑处理

你需要我的全部代码才能告诉你吗?我刚刚添加了一个精选案例的示例,向您展示其复杂性

CASE 
    WHEN (g.date_fin_contrat > :date_quittancement_max) THEN FLOOR(TIMESTAMPDIFF(month,  MAX(g.date_quittancement_echeance), :date_quittancement_max)/12) 
    ELSE FLOOR(TIMESTAMPDIFF(month, MAX(g.date_quittancement_echeance), g.date_fin_contrat)/12)    
    END) nb_echeance_calculee, (
CASE 
    WHEN g.date_fin_contrat > :date_quittancement_max THEN g.montant_ht_actualise_echeance * ((1 - (pow((1+0.02),(FLOOR(TIMESTAMPDIFF(month,  MAX(g.date_quittancement_echeance), :date_quittancement_max)/12))))) / (1-(1+0.02)))  
    ELSE g.montant_ht_actualise_echeance * ((1 - (pow((1+0.02),(FLOOR(TIMESTAMPDIFF(month, MAX(g.date_quittancement_echeance), g.date_fin_contrat)/12))))) / (1-(1+0.02)))   
    END) somme_echeance_calculee, (
CASE 
     WHEN g.code_indice LIKE "%\%%" THEN ROUND((g.montant_ht_actualise_echeance*(1+(CAST(REPLACE((SUBSTRING(g.code_indice,1,LOCATE("%", g.code_indice)-1)),",",".") AS DECIMAL(10,4)))/100)),2)
     WHEN g.code_indice LIKE "ICC%" THEN 
          CASE 
              WHEN REPLACE(g.periode_courante_indice_echeance,SUBSTRING(g.periode_courante_indice_echeance,1,4),(CAST(SUBSTRING(g.periode_courante_indice_echeance,1,4) AS SIGNED INTEGER)+1)) IN (SELECT icc_periode FROM indice_icc) THEN ROUND((g.montant_ht_actualise_echeance*(SELECT CAST(REPLACE(icc_multiplicateur,",",".") AS DECIMAL(10,4)) FROM indice_icc WHERE REPLACE(g.periode_courante_indice_echeance,SUBSTRING(g.periode_courante_indice_echeance,1,4),(CAST(SUBSTRING(g.periode_courante_indice_echeance,1,4) AS SIGNED INTEGER)+1)) = icc_periode)),2)
              ELSE ROUND((g.montant_ht_actualise_echeance*(1.02)),2)
          END
     ELSE ROUND((g.montant_ht_actualise_echeance*(1.02)),2)
END
对 通常情况下,出于性能以外的原因,将查询拆分是理想的选择

一开始,试一下。如果速度更快,答案很简单:是的

这还允许您执行诸如分片、服务拥有的数据库和数据隔离、数据ACL等操作

MySQL在很多方面都很好。在多组数据之间执行复杂的交互,特别是在维护过于复杂或冗长的索引时,性能会很差。MySQL在很多方面都不是最好的工具;这就是像ElasticSearch这样的工具存在的原因。

是的 通常情况下,出于性能以外的原因,将查询拆分是理想的选择

一开始,试一下。如果速度更快,答案很简单:是的

这还允许您执行诸如分片、服务拥有的数据库和数据隔离、数据ACL等操作

MySQL在很多方面都很好。在多组数据之间执行复杂的交互,特别是在维护过于复杂或冗长的索引时,性能会很差。MySQL在很多方面都不是最好的工具;这就是像ElasticSearch这样的工具存在的原因。

通常缓慢的SQL查询是由大数据集、低效的联接或子查询或缺少索引字段造成的;并非来自SELECT或WHERE子句中的复杂逻辑

您应该将复杂的逻辑拉到PHP中,以便更好地进行布局和注释。因此,首先运行查询,然后在PHP中应用任何逻辑。代码库的未来维护者将感谢您

如果您只想在另一个查询的循环中运行一个查询,那么还应该避免中断查询。相反,您应该使用联合、子查询或外部联接。数据库就是为这类事情而设计的,比PHP快得多。

通常,SQL查询速度慢是因为数据集大、连接或子查询效率低或缺少索引字段;并非来自SELECT或WHERE子句中的复杂逻辑

您应该将复杂的逻辑拉到PHP中,以便更好地进行布局和注释。因此,首先运行查询,然后在PHP中应用任何逻辑。代码库的未来维护者将感谢您


如果您只想在另一个查询的循环中运行一个查询,那么还应该避免中断查询。相反,您应该使用联合、子查询或外部联接。数据库就是为这类事情而设计的,它将比PHP快得多。

一般来说,用PHP操作数据比用MySQL操作数据要快得多。数据库就是这样设计的,更不用说PHP了。因此,我建议将此逻辑保留在数据库中。如果您的查询速度较慢,您是否尝试过检查执行计划?唯一能够回答此问题的人是您,而您能够回答此问题的唯一方法是实现这两种方法,对其进行分析,并选择最佳方法。一般来说,与MySQL相比,用PHP操作数据不会更快。数据库就是这样设计的,更不用说PHP了。因此,我建议将此逻辑保留在数据库中。如果您的查询速度较慢,您是否尝试过检查执行计划?唯一能够回答此问题的人是您,而您能够回答此问题的唯一方法是实现这两种方法,对其进行分析,并选择最佳方法。