Php MySQL计数花费的时间太长,有很多连接
在我的项目中,我进行了3次查询,其中一次查询花费的时间太长。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_
我使用条令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其他。希望有帮助:)