MySQLのSQL文性能改善


categoryテーブル
---------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------------+--------------+------+-----+---------+-------+
| id | varchar(32) | | PRI | | |
| name | varchar(128) | | | | |
| keywords | text | YES | | NULL | |
| parent_id | varchar(32) | | | | |
+---------------------------+--------------+------+-----+---------+-------


このテーブルに対して
SELECT *
FROM category
WHERE id IN ( SELECT parent_id FROM category WHERE id='10');
を実行しています。idを指定してそれの親カテゴリの行を取得します

explainで実行計画を見ると親を見るときに主キーを使っていないので、主キーを使う様にできないでしょうか。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2007/02/23 20:58:26
  • 終了:2007/02/24 13:52:56

ベストアンサー

id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/02/24 00:32:02

ポイント50pt

b-windさんの回答にある「一つのクエリに付き一つの INDEX しか使用できない制約」は、実機確認した結果、MySQL 5.0では少なくともそういう制約はないようです。

ただし、サブクエリを使った場合、サブクエリ内では確かにインデクスは使われないようですね。

サブクエリをジョインに書き直すと、インデクスを有効利用できるようです。

http://dev.mysql.com/doc/refman/4.1/ja/rewriting-subqueries.html...

書き換え例としては、以下のようになります。

select x.* from category as x
 inner join category as y
 on x.id=y.parent_id
 where y.id='10'
id:huruyosi

回答ありがとうございます。JOINを使ったSQLに書き換えたらインデックスを使う様になり、アプリ全体としては1/10の時間で終ることが出来ます。

2007/02/24 13:49:40

その他の回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/02/23 21:13:56

ポイント20pt

おそらく無理。

MySQL は一つのクエリに付き一つの INDEX しか使用できない制約がある。

クエリを2つに分散すべきと思う。

MySQL(1) チューニングについての本 (LocalScope::)

MySQLが、クエリ毎、テーブル毎に最大インデックス一つしか使わないとか、もう聞いてびっくりな事とかしっかり説明されているので、良い(ほんとか)。

id:huruyosi

え~~そうなんですか。

回答ありがとうございます。

2007/02/23 23:08:01
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/02/24 00:32:02ここでベストアンサー

ポイント50pt

b-windさんの回答にある「一つのクエリに付き一つの INDEX しか使用できない制約」は、実機確認した結果、MySQL 5.0では少なくともそういう制約はないようです。

ただし、サブクエリを使った場合、サブクエリ内では確かにインデクスは使われないようですね。

サブクエリをジョインに書き直すと、インデクスを有効利用できるようです。

http://dev.mysql.com/doc/refman/4.1/ja/rewriting-subqueries.html...

書き換え例としては、以下のようになります。

select x.* from category as x
 inner join category as y
 on x.id=y.parent_id
 where y.id='10'
id:huruyosi

回答ありがとうございます。JOINを使ったSQLに書き換えたらインデックスを使う様になり、アプリ全体としては1/10の時間で終ることが出来ます。

2007/02/24 13:49:40

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません