mysql:15321
From: Masuda <Masuda <masuken@xxxxxxxxxx>>
Date: Wed, 2 Jun 2010 10:17:04 +0900
Subject: [mysql 15321] フィールド数とレコード数のパフォーマンス差について
増田と申します。お世話になっております。
現在、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
として、アクションフィールドのデータにその行為のターゲットを入れればデータは取れるので、
レコード数もあまり増えず、無駄なフィールドはあるものの、こちらのほうがよいのだろうかとも思ってしまいます。
この場合、どちらのほうがパフォーマンスとして望ましいのでしょうか?
データが多くなれば検証もできるのですが、現在データが少なく、比較できるほど大きなデータも持っていないため、もし何か分かりましたらご教授いただけると嬉しく思います。
増田
--
mailto:masuken@xxxxxxxxxx
-> 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: フィールド数とレコード数のパフォーマンス差について