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

mysql:15322

From: Miyata Masaki <Miyata Masaki <catlover@xxxxxxxxxx>>
Date: Wed, 02 Jun 2010 12:35:40 +0900
Subject: [mysql 15322] Re: フィールド数とレコード数のパフォーマンス差について

ミヤタと申します。

 > テーブルを用意する際に、以下のどちらの方法がパフォーマンス的に望ましいのか
 > 伺いたく思い、投稿させていただきました。

いきなりざっくりと私なりの結論を申し上げますと、「分からない」となりますが、
仮の状況として設定されたユーザ10名の例で言えば、「大差ないでしょう」となります。
ユーザ10名程度で業務系の処理を想定されていると思いますが、そうであれば
パフォーマンス(※)は大した問題にはならないと思います。

※パフォーマンスと一言で言われているのでそのまま使っていますが、
 パフォーマンスといっても、さまざまな要素があります。

ですが、テーブルの正規化という意味ではtable2の方が望ましく柔軟性も高いため、
問題なければtable2にしておく方が良いと思います。

ただ、処理が多少複雑になるとは思いますので、table1でも柔軟性やパフォーマンスに
などに問題がないと分かっている場合には、別にtable1でも構いません。
table1でパフォーマンス上不利になるのは、カラム数が増えるため、同時更新による
ロックなどで更新性能などが落ちることなどです。


 > ただし、アクションを2つ行えるのは3名しかいないため、残り7名にとっては無駄なフィールドがあって、
 > あまり効率よくない感じがします。

使用しないカラムはNULLにしておけば問題ないと思います。


 > ただし、フィールドに無駄はありませんし、WHERE句を使えばデータは取ってこれるので、
 > 1レコードとしては見にくいですが、データを素早く取ってこれることが大事なので、
 > こちらのほうがよいのかなと思っています。

厳密に言えば、データを素早く取ってくるという意味では、1行だけ取得すれば良いため、
table1の方が優れています。


 > 一ヶ月目で、130ぐらいレコード数が増えます。
 >
 > これを1000ヶ月とか10000ヶ月になった場合、膨大なレコード数になり、パフォーマンスが落ちないか心配な面があります。

それ位の行数であれば、全く問題ないと思います。
想定されているコンピューターに相応のデータを入れて試される事をオススメ致します。
MySQLやApacheのパフォーマンスに関する設定項目も多数ありますから、それらの設定でも
パフォーマンスは大きく変わりますし、コンピューターのCPUやメモリなどによっても、
パフォーマンスは大きく変わります。


 > table1だと、
 >
 > key | month | user_id | 1day_action1 | 2day_action1 .... 10day_action1
 > | 1day_action2 | .... 10day_action2
 >                                    target
 > として、アクションフィールドのデータにその行為のターゲットを入れればデータは取れるので、

すみません。上記の意味がよく分かりませんでした。


--
Masaki Miyata
catlover@xxxxxxxxxx

 > From: Masuda <masuken@xxxxxxxxxx>
 > To: ml@xxxxxxxxxx
 > Subject: [mysql 15321] フィールド数とレコード数のパフォーマンス差について
 > Date: 2010/06/02 10:17
 >
> 増田と申します。お世話になっております。
>
> 現在、php+mysqlでアプリケーションを作っているのですが、
> テーブルを用意する際に、以下のどちらの方法がパフォーマンス的に望ましいのか
> 伺いたく思い、投稿させていただきました。
>
> 状況(仮):
> ユーザ10名
> うち3名は2つのアクション
> 残りは1つのアクションのみ
> ユーザは毎日アクションを行うことができ、10日間アクションができるとする
>
> この場合に、
>
> --------------
> table1
>
> key | user_id | 1day_action1 | 2day_action1 .... 10day_action1 |
> 1day_action2 | .... 10day_action2
>
> とすべきか、
>
>
> table2
>
> key | user_id | action | day
>
> とすべきかで迷っております。
>
> table1であれば、一度user_idなどをINSERTしてしまえば、action部分をUPDATEするだけ(NOT
> NULL制約有)なので、フィールドもそこまで増えず、ある意味見やすいです。
> ただし、アクションを2つ行えるのは3名しかいないため、残り7名にとっては無駄なフィールドがあって、
> あまり効率よくない感じがします。
>
> table2だと、フィールドも少なく、actionの内容とその行為日だけを入れればよいので、
> 楽なのですが、INSERTが多くなり、レコード数も必然と増えます。
>
> ただし、フィールドに無駄はありませんし、WHERE句を使えばデータは取ってこれるので、
> 1レコードとしては見にくいですが、データを素早く取ってこれることが大事なので、
> こちらのほうがよいのかなと思っています。
>
> ---
>
> ただし、行為の対象として、targetフィールドを設けなければならなくなったり、
> 10日間を複数回繰り返すことができるようになり、1ヶ月目(10日間)、2ヶ月目(10日間)というように
> 増えて言った場合、table2だと、
>
> key | month | user_id | action | target | day
> となり、1monthで1user、10action(3人は20action)ですので、
> 一ヶ月目で、130ぐらいレコード数が増えます。
>
> これを1000ヶ月とか10000ヶ月になった場合、膨大なレコード数になり、パフォーマンスが落ちないか心配な面があります。
>
> table1だと、
>
>
> key | month | user_id | 1day_action1 | 2day_action1 .... 10day_action1
> | 1day_action2 | .... 10day_action2
>                                    target
> として、アクションフィールドのデータにその行為のターゲットを入れればデータは取れるので、
> レコード数もあまり増えず、無駄なフィールドはあるものの、こちらのほうがよいのだろうかとも思ってしまいます。
>
>
> この場合、どちらのほうがパフォーマンスとして望ましいのでしょうか?
> データが多くなれば検証もできるのですが、現在データが少なく、比較できるほど大きなデータも持っていないため、もし何か分かりましたらご教授いただけると嬉しく思います。
>
>
>
> 増田

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

     15321 2010-06-02 10:17 [Masuda <masuken@xxxx] フィールド数とレコード数のパフォーマンス差について
->   15322 2010-06-02 12:35 ┣[Miyata Masaki <catlo]                                       
     15325 2010-06-03 13:06 ┃┗[Masuda <masuken@xxxx] Re: [mysql 15322] Re: フィールド数とレコード数のパフォーマンス差について
   @ 15323 2010-06-02 16:31 ┗[らっちょ らっちょ <z]                                       
     15324 2010-06-02 18:57  ┣[岩崎 誠司 <iwasaki_]                                     
     15327 2010-06-03 13:37  ┃┗[Masuda <masuken@xxxx] Re: [mysql 15324] Re: フィールド数とレコード数のパフォーマンス差について
     15326 2010-06-03 13:29  ┗[Masuda <masuken@xxxx] Re: [mysql 15323] Re: フィールド数とレコード数のパフォーマンス差について