Nasıl bu SQL sorgu daha verimli hale getirebiliriz?

3 Cevap php

Ben bir kullanıcının tek tek abone olduğunuz kategorileri görüntülemek ve aynı zamanda varsayılan ait bölgede mevcut olanlar sayede bir sistem var.

So, the tables are as follows: Categories UsersCategories RegionsCategories

Ben de onlar için abone olduğunuz tüm bireysel kategoriler kendi bölgedeki tüm kategoriler için db sorgulama ve ediyorum.

Şöyle Benim sorgu:

        Select * FROM (categories c)
        LEFT JOIN users_categories uc on uc.category_id = c.id
        LEFT JOIN regions_categories rc on rc.category_id = c.id
        WHERE (rc.region_id = ? OR uc.user_id = ?)

En azından ben Cake ORM katmanı kullanarak kuruyorum, bu sorgu inanıyorum, yani tam bir tanesidir:

        $conditions = array(
                             array( "OR" => array (
                                'RegionsCategories.region_id' => $region_id,
                                'UsersCategories.user_id' => $user_id
                             )
        ));
        $this->find('all', $conditions);

Bu inanılmaz yavaş çıkıyor (bazen yaklaşık 20 saniye kadar. Her tablo yaklaşık 5000 satır var). Burada hata benim tasarım mı?

How can I retrieve both the users' individual categories and those within their region all in one query without it taking ages?

Teşekkürler!

3 Cevap

Categories.id, users_categories.category_id, users_categories.user_id, regions_categories.category_id ve regions_categories.region_id sütunları tüm endeksli olduğundan emin olun.

Jmans önerileri şimdiden hayata geçirilmiştir varsayarsak;

IIRC MySQL sorguları yalnızca bir seferde bir dizin kullanabilirsiniz ve böylece OR pahalı olabilir ve her sorgu, farklı bir dizin kullanmak için izin, iki sorgu ve BİRLİĞİ onları bölmek için daha hızlı olabilir

Bunu dene:

select * from
(
 select category_id from users_categories where user_id = ?
 union
 select category_id from region_categories where region_id = ?
) as q
inner join categories c on c.id = q.category_id

Dolayısıyla daha etkin bir şekilde sunucu kullanım endeksleri icar - Ben aynı işi yapar, ama (çoğu RDBMSs ile önlemek için bir şey olduğu) VEYA kullanan yok sanırım. Zaten jmans tarafından belirtildiği gibi neden ki, sizin verilerinizi dizine düşünmelisiniz.