2 つのテーブルに対してクエリを実行していますが、何らかの理由でインデックスを使用していません。私はそれが私の人生のために私たちのものだとは理解できません。
ここに私のテーブルがあります:table1
とtable2
. 表 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)
たが、それでも結果は変わりません。これがランダムに使用されるクエリであればそれほど問題にはなりませんが、このクエリは毎日何万回もアクセスされています。
このクエリが利用可能なインデックスを使用して行数を大幅に削減していないというのは、何が間違っているのでしょうか?
正しい情報を提供したことを願っています。前もって感謝します。