mysql:962
From: "MINOHATA Norio" <"MINOHATA Norio" <minohata@xxxxxxxxxx>>
Date: Thu, 10 Jun 1999 13:26:51 +0900
Subject: [mysql 00962] Re: [Q] 分割列による SELECT のスピード比較
箕畑@旭紙業です。 既に誰かが同じことを投稿されたかもしれませんが、 > ■OR連結の場合のEXPLAINの結果 > +---------+------+-------------------+------+---------+------+--------+------------+ > | table | type | possible_keys | key | key_len | ref | rows | Extra | > +---------+------+-------------------+------+---------+------+--------+------------+ > | keytbls | ALL | key01,key02,key03 | NULL | NULL | NULL | 195744 | where used | > +---------+------+-------------------+------+---------+------+--------+------------+ を見ると、どうやらMySQLは 「インデックス使っても効果なさそうだから使わない」 ということで結審しちゃったようですね。 # 間違ってたらごめんなさい。 この判決を覆すには、多分MySQLのソースに手を加えるしかなさそうです。 その代わりに、次のようにテーブルの定義から見直されると如何でしょう。 main +--+--------+ |id| data | +--+--------+ | 1| ***| | 2| ???| | 3| +++| ... keywords +--+-----------+ |id| keyword | +--+-----------+ | 1| Perl| | 1| is| | 2| an| | 3|interpreted| | 3| language| | 3| optimized| ... というふうに2つのテーブルに分割して、 キーワード検索の場合は、 SELECT DISTINCT main.data FROM main, keywords WHERE keywords.keyword LIKE 'i%' AND keywords.id=main.id というふうにテーブルを結合するようにすれば、 1レコードあたりのキーワード数を3個(あるいは12個と) 固定する必要がなくなります。 また、検索に必要なインデックスは mainテーブルの id項(UNIQUE) keywordsテーブルの keyword項 の2つです。 # 頻繁にDELETEやUPDATEする場合は、 # keywordsテーブルのid項 にもインデックスを # 作っておいた方がいいでしょう。 -- 有限会社アイピーシー/旭紙業株式会社 箕畑典男 minohata@xxxxxxxxxx
955 1999-06-10 00:26 [Takashi YAMAMOTO <ya] [Q] 分割列による SELECT のスピード比較 956 1999-06-10 09:25 ┣[KATSURO Tomokazu <to] 957 1999-06-10 10:47 ┗[民斗 <tommy@xxxxxxxx] 958 1999-06-10 11:03 ┗[Takashi YAMAMOTO <ya] 959 1999-06-10 11:12 ┣[<endo@xxxxxxxxxx> ] 960 1999-06-10 13:01 ┃┗[民斗 <tommy@xxxxxxxx] 963 1999-06-10 13:16 ┃ ┗[<endo@xxxxxxxxxx> ] 961 1999-06-10 13:17 ┣[民斗 <tommy@xxxxxxxx] -> 962 1999-06-10 13:26 ┗["MINOHATA Norio" <mi]