人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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で実行計画を見ると親を見るときに主キーを使っていないので、主キーを使う様にできないでしょうか。


●質問者: huruyosi
●カテゴリ:ウェブ制作
✍キーワード:FIELD Key MySQL name PRI
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● b-wind
●20ポイント

おそらく無理。

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

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

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

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

◎質問者からの返答

え??そうなんですか。

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


2 ● chuken_kenkou
●50ポイント ベストアンサー

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'
◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ