php - Y a-t-il un problème de performances si une instruction SQL est écrite comme ceci? ? Comment améliorer? ?
高洛峰
高洛峰 2017-05-24 11:30:34
0
1
576

Requête conjointe multi-tables + sous-requête + requête conditionnelle + tri

SELECT
  ac.*,
  c.car_number,
  c.car_name,
  cs.car_source,
  cb.brand_name,
  cm.car_model,
  ct.car_type,
  c.number_plate,
  (
  SELECT
    COUNT(ar.auction_record_id)
  FROM
    csp_auction_record AS ar
  WHERE
    ac.auction_car_id = ar.auction_car_id
) AS auction_count
FROM
  csp_auction_car AS ac
INNER JOIN
  csp_car AS c
ON
  ac.car_id = c.car_id
INNER JOIN
  csp_car_brand AS cb
ON
  c.car_brand_id = cb.car_brand_id
INNER JOIN
  csp_car_source AS cs
ON
  c.car_source_id = cs.car_source_id
INNER JOIN
  csp_car_type AS ct
ON
  c.car_type_id = ct.car_type_id
INNER JOIN
  csp_car_model AS cm
ON
  c.car_model_id = cm.car_model_id
WHERE
  ac.auction_s_time <= CURRENT_TIMESTAMP AND ac.auction_e_time >= CURRENT_TIMESTAMP
ORDER BY
  ac.auction_car_id
DESC
LIMIT 0, 10

Fiche technique associée :

csp_car_brand, liste des marques de véhicules :

csp_car_type, tableau des types de véhicules :

csp_car_source, tableau des sources de véhicules :

csp_car_model, tableau des modèles de véhicules (modèle spécifique à la marque) :

csp_car, table des véhicules (cette table comporte trop de champs, seuls certains sont répertoriés)

csp_auction_record, liste des records d'enchères :

Y a-t-il un problème de performances avec cette instruction SQL ? ? Comment optimiser ? ? Dois-je utiliser PHP pour le diviser en instructions SQL simples, puis combiner les résultats, ou quoi ? ?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(1)
phpcn_u1582

Depuis que vous avez posé cette question, cela signifie que vous savez qu'il y a un problème avec votre SQL. Le problème est que la table csp_auction_record est analysée autant de fois qu'il y a d'enregistrements dans la table csp_auction_car. C'est effrayant d'y penser, mais je vois que beaucoup de gens aiment écrire ceci. Essayez également d'écrire la condition Where dans la sous-requête. La quantité de données dans la table ac sera considérablement réduite et l'association ultérieure sera plus rapide.
Peut être modifié comme suit, la table csp_auction_record n'est analysée qu'une seule fois

SELECT ac.*,
       c.car_number,
       c.car_name,
       cs.car_source,
       cb.brand_name,
       cm.car_model,
       ct.car_type,
       c.number_plate,
       IFNULL(ar.count, 0) AS auction_count
  FROM (select *
          from csp_auction_car
         WHERE auction_s_time <= CURRENT_TIMESTAMP
           AND auction_e_time >= CURRENT_TIMESTAMP) AS ac
 INNER JOIN csp_car AS c
    ON ac.car_id = c.car_id
 INNER JOIN csp_car_brand AS cb
    ON c.car_brand_id = cb.car_brand_id
 INNER JOIN csp_car_source AS cs
    ON c.car_source_id = cs.car_source_id
 INNER JOIN csp_car_type AS ct
    ON c.car_type_id = ct.car_type_id
 INNER JOIN csp_car_model AS cm
    ON c.car_model_id = cm.car_model_id
  left outer join (select auction_car_id, count(*) count
                     from csp_auction_record
                    group by auction_car_id) ar
    on ac.auction_car_id = ar.auction_car_id
 ORDER BY ac.auction_car_id DESC LIMIT 0, 10

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!