Kira bilangan model berkaitan Laravel dan Mysql melalui jadual perantaraan menggunakan syarat tambahan.
P粉514458863
P粉514458863 2023-07-24 15:47:02
0
1
538
<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>
P粉514458863
P粉514458863

membalas semua(1)
P粉618358260

Saya belum menguji ini tetapi saya akan mencuba sesuatu yang serupa

Shop::whereIn('owner_id', [123])
            ->withCount(['products' => fn($query) => $query->select(['id','type_id'])->whereColumn('products.type_id', '=', 'shops.type_id')])
            ->get()

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!