mysql:2227
From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Wed, 21 Jun 2000 23:39:18 +0900
Subject: [mysql 02227] Re: プログラム効率とデータベースの処理スピード
とみたです。 On Wed, 21 Jun 2000 18:12:41 +0900 moeru@xxxxxxxxxx (moeru) wrote: > 前から質問しようと思っていたのですが > すこし前のメーリングリストに、とみたさんが > MySQLは結合関係が弱いってコメントが気になっています。。 え、そんなこと…言ったような気もする…(^^; 多分、結合の種類が少ないという意味じゃなかったかと思います。 > プログラム効率とデータベースの処理スピードを考えた場合 > MySQLのSQL文は、テーブルを1つに絞った方が効率がいいのか > それとも、テーブルを結合してそれぞれのデータを抽出した方がいいのか? > どっちでしょう? > ものによっては、3つとか平気で結合しちゃってます(^^; ん〜、場合によるでしょうね。 > 上記の場合、アイテムテーブルに入っているカテゴリー番号から > カテゴリーテーブルのカテゴリー名を抽出するためにテーブルを結合しています。 > これは、テーブルを結合しない処理をした方が速いですか? 今回の例では、たいして変わらないんじゃないかと思います。なんとなく。 item.category と category.cat_id は数値型で、両方にインデックスを 設定しているんですよね。 > それから、残り時間を算出するところですが > インデックスを使うようにするにはどうしたらいいかがわかりません。 > > 明示的にインデックスを使うようにするって方法自体が分かりません。 > どういうときにINDEXを使っているのか?ってことです。 マニュアルを読みましょう。12.4 章あたり。 実際にインデックスが使用されているかどうかは explain してみればわかります。 > インデックスを使うようにするには、 > SELECTかWHEREのところで、 > インデックスに指定しているフィールド名を書けば使われるということでしょうか? > 今まで、SQL文にINDEXを指定したフィールドが登場すれば > 必然的に使われるとばかり思っていたのです(^^; 計算しないといけない条件にはインデックスは使われないんじゃないかと。 今回の条件は ends - UNIX_TIMESTAMP() < 86400 and ends - UNIX_TIMESTAMP > 0 ですが、UNIX_TIMESTAMP() はプログラム側でも得られますよね。 で、SQL を作るときにその値を使用すれば定数との比較になるので、 インデックスが使われるようになると思います。 ends < $time+86400 and ends > $time または ends between $time and $time+86400 のようにして。 --- とみたまさひろ <tommy@xxxxxxxxxx> http://www.tmtm.org 日本MySQLユーザ会 http://www.mysql.gr.jp
2219 2000-06-19 23:37 [<moeru@xxxxxxxxxx> ] SELECT 句で演算をした別名は WHERE 句では使えない? 2220 2000-06-20 01:24 ┣["Ningfeng Yang" <yan] 2221 2000-06-20 05:39 ┗[Tamon <tamon@xxxxxxx] 2224 2000-06-20 18:51 ┗[<moeru@xxxxxxxxxx> ] 2225 2000-06-21 01:27 ┗[Tamon <tamon@xxxxxxx] 2226 2000-06-21 18:12 ┗[<moeru@xxxxxxxxxx> ] プログラム効率とデータベースの処理スピード -> 2227 2000-06-21 23:39 ┗[とみたまさひろ <tomm] 2228 2000-06-22 17:08 ┗[<moeru@xxxxxxxxxx> ]