1

ユーザーが購入したアイテムのテーブルがあり、そのテーブル内にカテゴリ識別子があります。そこで、同じテーブルから、すでに購入したのと同じカテゴリの他のアイテムをユーザーに表示したいと思います。

私が試しているクエリは実行に22秒以上かかり、メインアイテムテーブルは3000行にもなりません...なぜそれほど非効率的なのですか?インデックスを作成する必要がありますか?その場合、どの列にインデックスを付けますか?

クエリは次のとおりです。

select * from items
    where category in (
        select category from items 
        where ((user_id = '63') AND (category <> '0')) 
        group by category
    ) 
order by dateadded desc limit 20
4

4 に答える 4

1

これがクエリです。そして、、、にインデックスを追加しcategoryuser_idくださいdateadded

select i1.* 
from items i1
inner join 
(select distinct 
           category 
        from items 
        where ((user_id = '63') AND (category <> '0'))
) i2 on (i1.Category=i2.Category)


order by i1.dateadded desc limit 20
于 2012-12-05T18:38:53.150 に答える
1

パフォーマンスを向上させるために、自己結合を次のように使用してみてください。

 select i1.* from items i1 JOIN items i2 on i1.category= i2.category
 where i2.user_id = '63' AND i2.category <> '0'
 group by i2.category
 order by i1.dateadded desc limit 20

結合は、ネストされたサブクエリよりもはるかに高速です。

編集: asなしで試してくださいgroup by:

 select i1.* from items i1 JOIN items i2 on i1.category= i2.category
 where i2.user_id = '63' AND i2.category <> '0'
 order by i1.dateadded desc limit 20
于 2012-12-05T17:31:26.843 に答える
1

必要に応じてインデックスを配置する適切な場所はdateadded、 、user_idおよび/またはcategory

于 2012-12-05T17:31:55.500 に答える
0

インデックスを作成するcategoryと、場合によってdateaddedは、処理速度が少し向上するはずです。

于 2012-12-05T17:30:55.227 に答える