php - Adakah terdapat masalah prestasi jika pernyataan sql ditulis seperti ini? ? Bagaimana untuk menambah baik? ?
高洛峰
高洛峰 2017-05-24 11:30:34
0
1
586

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? ?

高洛峰
高洛峰

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

membalas semua(1)
phpcn_u1582

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan