Kira bilangan model berkaitan Laravel dan Mysql melalui jadual perantaraan menggunakan syarat tambahan.
P粉514458863
2023-07-24 15:47:02
<p>Saya mempunyai pertanyaan MySQL (dibina menggunakan pemuatan bersemangat Laravel Eloquent dan fungsi withCount) yang mengalami beberapa masalah prestasi apabila menangani set data yang besar, adakah terdapat cara untuk memperbaiki pertanyaan di bawah? </p><p>Saya perlu mendapatkan semua kedai dan mengira bilangan produk yang berkaitan dengan kedai (dikaitkan melalui jadual perantaraan), tetapi terdapat syarat tambahan bahawa type_id kedai adalah sama dengan id_jenis produk. Saya rasa syarat kedua ini menyebabkan pertanyaan tidak menggunakan indeks yang betul. </p><p>Terdapat jadual perantaraan antara kedua-dua model. </p><p> kedai(id, type_id, owner_id) product(id, type_id) store product(shop_id, product_id) </p><p> Saya mempunyai indeks pada semua kunci asing, juga ada indeks komposit pada shop_product(shop_id, product_id). </p><p>Jadi pertanyaan saya ialah ini: </p><p><br /></p>
<pre class="brush:php;toolbar:false;">pilih
kedai.*,
(
pilih
kira(*)
daripada
produk
inner join shop_products on
products.id = shop_products.product_id
di mana
shops.id = shop_products.shop_id
dan products.type_id = shops.type_id)
daripada
kedai-kedai
di mana
shops.owner_id in (?)</pre>
<p>adakah mungkin pertanyaan ini boleh dioptimumkan entah bagaimana, mungkin tidak menggunakan pertanyaan withCount whereColumn laravel ini?</p>
<pre class="brush:php;toolbar:false;">... Shop::withCount(['products' => fn($query) => $query->whereColumn('products. type_id', '=', 'shops.type_id')]);</pre>
<p>Pertanyaan lengkap adalah seperti ini:</p>
<pre class="brush:php;toolbar:false;">Shop::whereIn('owner_id', [123])
->withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')])
->dapatkan()</pre>
<p>Adakah saya perlu menambah indeks gabungan pada kedai(id, type_id) dan produk(id, type_id)? </p>
Saya belum menguji ini tetapi saya akan mencuba sesuatu yang serupa
Jadi saya hanya menambah beberapa medan (yang anda perlukan dan yang apl perlukan untuk mengenal pasti produk), tetapi jika kiraan sahaja diperlukan, saya akan mencuba tanpa ID.
Saya andaikan apabila anda mendapat "produk" ia akan menarik semua data, ia akan menjadi perlahan jika terdapat medan jenis "teks" seperti badan/penerangan dll.
Selain itu, tidak pasti, tetapi anda boleh cuba menggunakan type_id dan bukannya products.type_id kerana anda sudah pun berada dalam perhubungan produk. Juga lihat mengoptimumkan cara anda menarik kedai anda.