mysql:4806
From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Mon, 10 Dec 2001 00:40:44 +0900
Subject: [mysql 04806] Re: WHERE 節の内容によって検索時間が大きく違います
とみたです。 On Sun, 09 Dec 2001 10:39:41 +0900 office@xxxxxxxxxx wrote: > さっきためしにインッディックを > ALTER TABLE DB1.kansou_tb ADD INDEX(dkey,k_flag,k_id); > と追加してみたら > > SELECT * FROM DB1.kansou_tb > where (dkey='1000')&&(k_flag='1')&&(k_id >300000) > order by k_id desc limit 0,5 > > 5 rows in set (0.01 sec) > ってな感じで脅威的に速くなりました。 最初の (k_id, k_flag, dkey, stno, u_id) というインデックスは、k_id + k_flag + dkey の組み合わせを見つけるのにはすばやく検索できるんですが、今 回の条件では、k_id が範囲を指定しているので、効率が悪かったんではないか と思います。 (dkey, k_flag, k_id) というインデックスは、dkey + k_flag だけの条件でも 使用されるので、まず dkey=1000 && k_flag=1 の条件で検索して、その中から k_id の条件を満たすものを抜き出すという処理になって、結果的に速くなった のではないかと思います。 複数のフィールドをひとつのインデックスにするのは、インデックスを使用され る条件を良く考えないと、こういう問題がおきますね。普通に、検索条件に使用 されるフィールドをそれぞれ独立したインデックスとして作成するのが簡単だと 思います。 CREATE TABLE kansou_tb ( 〜 UNIQUE (k_id), INDEX (dkey), INDEX (k_flag) ); のようにして。 -- とみたまさひろ <tommy@xxxxxxxxxx> 日本MySQLユーザ会 http://www.mysql.gr.jp
4801 2001-12-09 00:43 [<office@xxxxxxxxxx> ] WHERE 節の内容によって検索時間が大きく違います 4802 2001-12-09 10:11 ┣[Takeharu Masuda <tac] 4803 2001-12-09 10:39 ┗[<office@xxxxxxxxxx> ] 4804 2001-12-09 21:10 ┣[Takeharu Masuda <tac] 4805 2001-12-10 00:29 ┃┗[とみたまさひろ <tomm] 4807 2001-12-10 08:40 ┃ ┗[Takeharu Masuda <tac] -> 4806 2001-12-10 00:40 ┗[とみたまさひろ <tomm] 4808 2001-12-12 02:24 ┗[<office@xxxxxxxxxx> ]