[前][次][番号順一覧][スレッド一覧]

mysql:3828

From: "william" <"william" <william@xxxxxxxxxx>>
Date: Tue, 26 Jun 2001 10:31:04 +0900
Subject: [mysql 03828] Re: or 条件で、 Index が使われない

吉です。

どの項目がORで、何個くるかは不定なので、
どちかというと、MINOHATA様の提案が魅力的だと思います。

実はそれも聞きたいところです。^^;
また特許のデータベースを例とします。
公報の書誌事項の項目は20個ほどあります。

 ID  項目名           値
 ----------------------------------
 1   登録日           1999/01/01
 1   公開日又は公表日 1999/06/01
 1   キーワード       xxxx
 1   キーワード       yyyy
 .....
 ----------------------------------

などなど、1件の公報につき、20個ほどのレコードが出来ます。
すると、このテーブルは楽に1億を超えるレコード数になります。
MySQLって大丈夫?

-----
william@xxxxxxxxxx

----- Original Message -----
From: "MINOHATA Norio" <minohata@xxxxxxxxxx>
To: <ml@xxxxxxxxxx>
Sent: Monday, June 25, 2001 7:31 PM
Subject: [mysql 03821] Re: or 条件で、 Index が使われない


> > INDEX(公開日又は公表日,登録日)
> > の複合インデックスでも効果ないでしょうか?
>
> このインデックスは、公開日又は公表日が一意に決まっていて、
> なおかつ(=AND)、登録日が一意に決まっているか範囲が定まっている場合に
> 威力を発揮しますので、元発言の方のようなOR条件では使用されません。
>
> どうしてもインデックスを使用して
> SELECT一発で済ませたいならば、
>
> create table 公開書誌の日付 (
>   ID      int,
>   項目名  varchar(30),
>   日付    date,
>   index  XXX  (項目名, 日付)
> );
>
> というテーブルを作って、
>
> ID  項目名           日付
> ----------------------------------
> 1   登録日           1999/01/01
> 1   公開日又は公表日 1999/06/01
> 2   登録日           1999/03/01
> 2   公開日又は公表日 1999/08/01
> ----------------------------------
>
> という具合にデータを入れて、
>
> select distinct ID from 公報書誌の日付 where
> ((項目名='公開日又は公表日')
>  and (日付 >= '1998/05/01') and (日付 <= '1999/12/31'))
> or
> ((項目名='登録日')
>  and (日付 >= '1999/01/01') and (日付 <= '1999/12/31'))
>
> という感じでSQLを実行すればよいと思います。
> (試してませんが)
>
> でも、こんなことするくらいならSELECTを2回にわけて実行して
> アプリケーション側で何とかした方がいいかもしれません。
> (どちらがいいかは用途によると思います)
>
> # PostgreSQLではORでもインデックスが使用されるようになった
> # とかいうのをだいぶ以前に(一年以上?)耳にしましたが...
>
> --
> 箕畑典男
> http://www.onmap.co.jp/
> mailto:minohata@xxxxxxxxxx
>


[前][次][番号順一覧][スレッド一覧]

      3815 2001-06-25 16:13 ["william" <william@x] or 条件で、 Index が使われない          
      3816 2001-06-25 17:58 ┣[Akihiko Shinohara <s]                                       
      3817 2001-06-25 18:39 ┃┗["william" <william@x]                                     
      3820 2001-06-25 19:08 ┃ ┗[Akihiko Shinohara <s]                                   
      3821 2001-06-25 19:31 ┃  ┗["MINOHATA Norio" <mi]                                 
->    3828 2001-06-26 10:31 ┃   ┗["william" <william@x]                               
      3833 2001-06-27 10:33 ┃    ┗["MINOHATA Norio" <mi]                             
      3834 2001-06-27 11:46 ┃     ┣["西田 玄" <nishida@x] MyODBC で UPDATE ができない
      3835 2001-06-27 12:53 ┃     ┃┣[Kengo Jinno <kengo@x]                         
      3837 2001-06-27 13:59 ┃     ┃┃┗["西田 玄" <nishida@x]                       
      3839 2001-06-27 16:33 ┃     ┃┃ ┗["william" <william@x]                     
      3840 2001-06-27 16:58 ┃     ┃┃  ┗["西田 玄" <nishida@x]                   
      3863 2001-06-29 12:01 ┃     ┃┃   ┗["西田 玄" <nishida@x]                 
      3836 2001-06-27 13:22 ┃     ┃┗[madara <madara@xxxxx]                         
      3838 2001-06-27 16:20 ┃     ┗[Hiroshi Takiguchi <t]                           
      3818 2001-06-25 18:41 ┣[Seiji Tateyama <tate]                                       
      3819 2001-06-25 19:00 ┃┣["william" <william@x]                                     
      3825 2001-06-26 06:47 ┃┗[とみたまさひろ <tomm]                                     
      3826 2001-06-26 09:36 ┃ ┗["MINOHATA Norio" <mi]                                   
      3822 2001-06-25 20:36 ┗[Hiroshi Takiguchi <t]