0

2 つのテーブルに対してクエリを実行していますが、何らかの理由でインデックスを使用していません。私はそれが私の人生のために私たちのものだとは理解できません。

ここに私のテーブルがあります:table1table2. 表 1 は、154 行のカテゴリーのリストです。テーブル 1 のテーブル構造は次のようになります。

category_id (int11) - also has an index on it
name (varchar30) - also has an index on it
urltext (text)
nametext (text)

category_id     name    urltext   nametext
1           category1    blahblah     blahblah
2           category2    blahblah     blahblah
3           category3    blahblah     blahblah
4           category4    blahblah     blahblah
etc to rows
154           category154    blahblah     blahblah

表 2 には 100 万以上の行があり、製品カテゴリが関連付けられています。テーブル フィールドの構造は次のようになります。

row_id (bigint11) - also has an index
category_id (int3) - also has an index
product_id (int9) - also has an index

表 2 のデータは次のようになります。

row_id     category_id     product_id 
1               1            123456
2               4            123456
3               17            456789
4               42            456789
5               7            456789
6               88            888555

これが私のクエリです:

select * 
from table2 
INNER JOIN table1 
ON table2.category_id=table1.category_id 
where table2.product_id = 123456;

そして今、このクエリで Explain を実行すると、次のようになります。

id   select_type  table type  possible_keys     key       key_len  ref                 rows  Extra
1    simple       table1 ALL    PRIMARY          NULL      NULL     NULL                 154
1    simple       table2 ref    product_id,...   poduct_id  10      category_id, const   1     Using Where

どの製品も通常、1 ~ 4 の異なるカテゴリにのみ関連しています。したがって、インデックスが正しく使用されていれば、Explain の結果に table1 の 154 行が表示される代わりに、最大 4 行が表示されると考えるでしょう。

もともと table1.name を のtext代わりに設定していましvarchar(30)たが、それでも結果は変わりません。これがランダムに使用されるクエリであればそれほど問題にはなりませんが、このクエリは毎日何万回もアクセスされています。

このクエリが利用可能なインデックスを使用して行数を大幅に削減していないというのは、何が間違っているのでしょうか?

正しい情報を提供したことを願っています。前もって感謝します。

4

1 に答える 1