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: フィールド数とレコード数のパフォーマンス差について