Php MySQL计数花费的时间太长,有很多连接

Php MySQL计数花费的时间太长,有很多连接,php,mysql,symfony,doctrine-orm,doctrine,Php,Mysql,Symfony,Doctrine Orm,Doctrine,在我的项目中,我进行了3次查询,其中一次查询花费的时间太长。 我使用条令2和PHP,并使用QueryBuilder发出请求。 我有一个车辆列表(90万条记录)、一个客户列表(60万条记录)、一个用户列表(60万条记录)和一个客户列表(60万条记录)。 在我的第一个查询中,我计算了车辆总数。需要0.25s=>完美。 我的secound查询允许通过具有多个联接的不同筛选器查找车辆。需要0.5s=>完美。 以下是查询: SELECT [MANY THINGS] FROM vehicule v0_

在我的项目中,我进行了3次查询,其中一次查询花费的时间太长。
我使用条令2和PHP,并使用QueryBuilder发出请求。
我有一个车辆列表(90万条记录)、一个客户列表(60万条记录)、一个用户列表(60万条记录)和一个客户列表(60万条记录)。
在我的第一个查询中,我计算了车辆总数。需要0.25s=>完美。
我的secound查询允许通过具有多个联接的不同筛选器查找车辆。需要0.5s=>完美。
以下是查询:

SELECT [MANY THINGS] 
FROM vehicule v0_ 
INNER JOIN categorie_vehicule c1_ ON v0_.idCategorieVehicule = c1_.idCategorieVehicule 
INNER JOIN energie e2_ ON v0_.idEnergie = e2_.idEnergie 
LEFT JOIN vehicule_lastrdv v6_ ON (v6_.idVehicule = v0_.idVehicule) 
LEFT JOIN client c4_ ON v0_.idUtilisateur = c4_.idUtilisateur 
LEFT JOIN utilisateur u5_ ON c4_.idUtilisateur = u5_.idUtilisateur 
LEFT JOIN ​_client_has_groupe_etablissement t3_​ ON c4_.idUtilisateur = t3_.idUtilisateur 
LEFT JOIN groupe_etablissement g7_ ON t3_.idGroupeEtablissement = g7_.idGroupeEtablissement 
WHERE v0_.actifVehicule = 1 
ORDER BY v0_.idVehicule DESC 
LIMIT 207 
OFFSET 0;
最后一个查询是上一个请求的总返回行数:

SELECT COUNT(v0_.idVehicule) AS sclr_0 
FROM vehicule v0_ 
INNER JOIN categorie_vehicule c1_ ON v0_.idCategorieVehicule = c1_.idCategorieVehicule 
INNER JOIN energie e2_ ON v0_.idEnergie = e2_.idEnergie 
LEFT JOIN vehicule_lastrdv v3_ ON v3_.idVehicule = v0_.idVehicule 
LEFT JOIN client c4_ ON v0_.idUtilisateur = c4_.idUtilisateur 
LEFT JOIN utilisateur u5_ ON c4_.idUtilisateur = u5_.idUtilisateur 
LEFT JOIN ​_client_has_groupe_etablissement t6_​ ON c4_.idUtilisateur = t6_.idUtilisateur 
LEFT JOIN groupe_etablissement g7_ ON t6_.idGroupeEtablissement = g7_.idGroupeEtablissement 
WHERE v0_.actifVehicule = 1;
但是这个查询需要20秒

这是对这个请求的解释,但一切似乎都很好

id  select_type table                   partitions  type?   possible_keys                                                         key                               key_len   ref                               rows    Extra
1   PRIMARY     v0_                                 ref     IDX_D0599D4B9F7AC00B,IDX_D0599D4B323EB152,idx_vehicule_actifVehicule  idx_vehicule_actifVehicule        1         const                             440436  100.00  Using where
1   PRIMARY     e2_                                 eq_ref  PRIMARY                                                               PRIMARY                           4         r4-p19d.v0_.idEnergie             1       100.00  Using index
1   PRIMARY     c1_                                 eq_ref  PRIMARY                                                               PRIMARY                           4         r4-p19d.v0_.idCategorieVehicule   1       100.00  Using index
1   PRIMARY     <derived2>                          ref     <auto_key0>                                                           <auto_key0>                       5         r4-p19d.v0_.idVehicule            10      100.00  
1   PRIMARY     c4_                                 eq_ref  PRIMARY                                                               PRIMARY                           4         r4-p19d.v0_.idUtilisateur         1       100.00  Using index
1   PRIMARY     u5_                                 eq_ref  PRIMARY                                                               PRIMARY                           4         r4-p19d.c4_.idUtilisateur         1       100.00  Using index
1   PRIMARY     t3_                                 ref     PRIMARY,IDX_30B01ADE5D419CCB                                          PRIMARY                           4         r4-p19d.c4_.idUtilisateur         1       100.00  Using index
1   PRIMARY     g7_                                 eq_ref  PRIMARY                                                               PRIMARY                           4         r4-p19d.t3_.idGroupeEtablissement 1       100.00  Using index
2   DERIVED     rdv                                 index   PRIMARY,IDX_86645D0C4FFC60ED,idx_rdv_idRDV_dateRDV_idAgenda           idx_rdv_idRDV_dateRDV_idAgenda    17        981941                                     33.33  Using where; Using index; Using temporary; Using filesort
2   DERIVED     agenda                              eq_ref  PRIMARY,IDX_2B41CD41EA190502                                          PRIMARY                           4         r4-p19d.rdv.idAgenda              1       100.00  Using where
2   DERIVED     etablissement                       eq_ref  PRIMARY                                                               PRIMARY                           4         r4-p19d.agenda.idEtablissement    1       100.00  
2   DERIVED     _vehicule_has_controle              ref     IDX_1EAA071A9F61066B                                                  IDX_1EAA071A9F61066B              5         r4-p19d.rdv.idRDV                 1       100.00
id选择类型表分区类型?可能的\u键\u len ref行额外
1个主v0参考IDX_D0599D4B9F7AC00B,IDX_D0599D4B323EB152,IDX_车辆_活动单元IDX_车辆_活动单元1常数440436 100.00,其中
1主e2_uu_u参考主4 r4-p19d.v0_uu.idEnergie 1 100.00使用索引
1个一回路c1_uu参考一回路4 r4-p19d.v0_uu.idCategorieVehicule 1 100.00使用索引
1个主要参考5 r4-p19d.v0_uu.id车辆10 100.00
1个一回路c4_uu参考一回路4 r4-p19d.v0_uu.id利用率1 100.00使用指数
1一级u5_uuu参考一级r4-p19d.c4_uuu.id使用索引1 100.00
一次t3_uu参考一次,IDX_30B01根据5D419CCB一次4 r4-p19d.c4_uu.idUserateATUR 1 100.00使用索引
1主g7_uu_u_u参考主4 r4-p19d.t3_uu.IDGroupeTables100.00使用索引
2导出的rdv索引主要,IDX_86645D0C4FFC60ED,IDX_rdv_idRDV_idAgenda IDX_rdv_idRDV_IDRGENDA 17 981941 33.33,使用where;使用指数;使用临时设备;使用文件排序
2衍生议程eq_ref PRIMARY,IDX_2B41CD41EA190502 PRIMARY 4 r4-p19d.rdv.idAgenda 1 100.00使用where
2导出的Etablisement eq_ref PRIMARY 4 r4-p19d.agenda.Idetablisement 1100.00
2衍生车辆具有参考IDX的控制装置1EAA071A9F61066B IDX 1EAA071A9F61066B 5 r4-p19d.rdv.idRDV 1 100.00
我想知道如何在MySQL中直接或通过doctrine减少执行时间

我已经尝试过使用
SQL\u CALC\u FOUND\u ROWS
,但这需要相同的时间。

还有countRows或count in doctrine

解释底部的派生表是什么?我无法将它们与您发布的任何查询联系起来。其中,rdv看起来很大,并且在额外的列中使用了临时的、使用文件排序的功能—这些功能可能需要很长时间。但是,当您在count query中不使用来自这些功能的数据时,为什么需要所有这些
左连接呢?@Shadow derevied是因为Vehicleue\u lastrdv是MySQL中的一个视图。但是这个请求不需要很多时间。@Ilya Yarkovets我使用所有左连接进行第二个查询筛选。用户可以过滤车辆列表。我想显示车辆总数和过滤车辆总数。这就是为什么我使用相同的请求来计数。但是我尝试在第二个查询中添加SQL\u CALC\u FOUND\u行,但这需要相同的时间(20秒)好的,但是为什么不“按需”加入它们呢?我的意思是这样的smth:
如果用户选择了一些过滤器,我们就会添加所需的join语句(伪代码)。并且提供的查询会很慢,只是因为有太多的大型联接表,而这些表目前不需要。在没有选择过滤器的情况下,使用join的“按需”将为您提供更好的性能,但是对于选择了很多过滤器/全部过滤器的情况,您必须简化查询,或者对大型表使用smth打火机、类似mayber的视图,或者使用一些结果缓存或smth其他。希望有帮助:)