cari

Rumah  >  Soal Jawab  >  teks badan

php - Adakah terdapat masalah prestasi jika pernyataan sql ditulis seperti ini? ? Bagaimana untuk menambah baik? ?

Pertanyaan bersama berbilang jadual + subkueri + pertanyaan bersyarat + pengisihan

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

Lembaran data berkaitan:

csp_car_brand, senarai jenama kenderaan:

csp_car_type, jadual jenis kenderaan:

csp_car_source, jadual sumber kenderaan:

csp_car_model, meja model kenderaan (model khusus jenama):

csp_car, meja kenderaan (meja ini terlalu banyak medan, cuma ada yang tersenarai)

csp_auction_record, senarai rekod lelongan:

Adakah terdapat sebarang masalah prestasi dengan pernyataan sql ini? ? Bagaimana untuk mengoptimumkan? ? Patutkah saya menggunakan PHP untuk membahagikannya kepada pernyataan SQL mudah dan kemudian menggabungkan hasilnya, atau apa? ?

高洛峰高洛峰2798 hari yang lalu633

membalas semua(1)saya akan balas

  • phpcn_u1582

    phpcn_u15822017-05-24 11:32:34

    Sejak anda bertanya ini, bermakna anda tahu ada masalah dengan sql anda. Masalahnya ialah jadual csp_auction_record diimbas seberapa kerap yang terdapat dalam jadual csp_auction_car. Seram untuk memikirkannya, tetapi saya melihat ramai orang suka menulisnya seperti ini. Juga, cuba tuliskan keadaan di mana dalam subquery Jumlah data dalam jadual ac akan dikurangkan dengan banyak, dan perkaitan seterusnya akan menjadi lebih cepat.
    Boleh ditukar kepada yang berikut, jadual csp_auction_record hanya diimbas sekali sahaja

    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
    
    

    balas
    0
  • Batalbalas