mysql:2004
From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Thu, 11 May 2000 21:06:46 +0900
Subject: [mysql 02004] Re: 正規化と高速化
とみたです。 At Thu, 11 May 2000 20:07:05 +0900, moeru@xxxxxxxxxx (moeru) wrote: > CREATE TABLE items ( > itemid int(20) NOT NULL AUTO_INCREMENT, > username VARCHAR(20) NOT NULL, > title tinytext, > date timestamp(14), > description text, > PRIMARY KEY (itemid), > INDEX (title), > INDEX (date), > INDEX (username), > ), 〜〜 > MySQLの場合、以下のようにusersテーブルとitemsテーブルをリレーションして > usersテーブルの情報(usernameやemail)をもらってきたほうが高速なのでしょうか? 単純に考えたら、join しない方がその分の処理が要らないから、速いような気 はします。 ただ、上の例の items テーブルは、userid INT NOT NULL, INDEX(userid) を追 加しておいて、username じゃなくて userid で検索した方が速いと思います。 # 20バイトの比較と4バイトの比較では、4バイトの方が速いでしょう。きっと。 > 以下では、INDEX (username)は、リレーションしてるから必要ないと思って > はずしました。。 > > CREATE TABLE items ( > itemid int(20) NOT NULL AUTO_INCREMENT, > userid INT NOT NULL, > title tinytext, > date timestamp(14), > description text, > PRIMARY KEY (itemid), > INDEX (title), > INDEX (date), > ), INDEX (userid) はあった方がいいでしょう。 なお、title に INDEX を張って高速化になるのは、title の先頭から一致する 文字列を検索する場合だけだと思います。 > * itemsテーブルでは、userid INT NOT NULL, > のAUTO_INCREMENTは必要ないと思って取りました。。これは正解ですか? 正解です。 > 正規化によって、検索を高速化するためには > それぞれのテーブルにだぶりのフィールドが無い(ID以外皆無に)すると理解して良いのでしょうか? 正規化したら高速化できるってわけではないと思います。高速化のためにわざと 正規化しないこともありますし。 正規化することで、テーブルの大きさが小さくなって、I/O が速くなるってこと もあると思います。 > 例え、フィールドが他のテーブルとダブっても、 > 目的によっては、一つのテーブルに必要な情報が入ってる方が高速 > とかいう場合もあるのかどうかも知りたいです。。 join 処理に負荷がかかるんなら一つのテーブルの方が速いこともあるかもしれ ません。 -- とみたまさひろ <tommy@xxxxxxxxxx>
1999 2000-05-11 18:09 [Kakiuchi Atsuko <m00] 自動起動開始するには? 2000 2000-05-11 18:41 ┣[とみたまさひろ <tomm] 2001 2000-05-11 19:21 ┗[Ko Tanikawa <tanikaw] 2002 2000-05-11 20:07 ┗[<moeru@xxxxxxxxxx> ] 正規化と高速化 -> 2004 2000-05-11 21:06 ┗[とみたまさひろ <tomm] 2005 2000-05-11 23:46 ┗[<moeru@xxxxxxxxxx> ] 2006 2000-05-12 09:30 ┗[とみたまさひろ <tomm] 2008 2000-05-12 18:55 ┗[<moeru@xxxxxxxxxx> ] 2009 2000-05-12 19:10 ┗[とみたまさひろ <tomm] 2010 2000-05-12 19:36 ┗[<moeru@xxxxxxxxxx> ] 2011 2000-05-12 19:54 ┗[とみたまさひろ <tomm]