• ベストアンサー

テーブルの作成時にふと疑問が

いつもお世話になっております。 今データベースを勉強しようとおもい いろいろ本を読んで勉強しているのですが どうしてもわからないことがあります。 テーブルの作成時にindexやkeyの指定の仕方は 掲載されているのですが、どんなレコードに付けるのか? また、指定した結果どのような恩恵を受けるのかが いまいちわかりません。 postgresqlの本を2冊ほど読み PHPからデータを出し入れしてるレベルですが インターネットで検索しても、検索の仕方が悪いのか 指定方法は出てくるのですが、どうして指定するのか間では見つけられません。 もしかして、データベースをやる方ならば当たり前に知っていることなのか? というような、超初心者な質問で申し訳ありませんが、 どなたか、ご教授お願いいたします。 もやもやして、わからないことがあると勉強もなかなか先に進めません。 よろしくお願いいたします。

  • fichi
  • お礼率38% (24/63)

質問者が選んだベストアンサー

  • ベストアンサー
  • masakin
  • ベストアンサー率59% (32/54)
回答No.1

はじめまして。 うぅ~む。改めて考えると「なんで」って思ってしまった^^;。 インデクスを指定したことの最大の恩恵は『検索速度の向上』だと思います。 件数が少ないDBだとその差はわからないと思いますが、数百万件のデータの検索となった場合、インデクスの有無で検索速度は大変違ってきます。これに、GROUP BYやJOINすると大変な違いとなります。 第2の恩恵は『DB正規化の容易』でしょうか? プライマリーキーを指定することで、コードなど重複不可なデータを誤ってDBに追加できないようにできます。PGレベルで考慮することが少なくなります。 しかし、インデクスをすべての列に指定すると、更新・追加などでインデクスメンテを行うため、効率が悪くなってしまいます。必要な列にのみ指定したほうがよいと思います。 SQL文を主に取り扱った書籍よりリレーショナルデータベース関連の本を探してみると、記述があると思います。 少々はお役に立てたでしょうか?

fichi
質問者

お礼

早速のご回答ありがとうございます。 検索速度の向上とDB正規化の容易ですか テストで作るような小さなデータベースにはあまり必要無いということですね。 今日の帰りに早速リレーショナルデータベース関連の本を探してこようと思います。 ありがとうございました。

その他の回答 (2)

  • msystem
  • ベストアンサー率42% (79/186)
回答No.3

Indexをつけるのは、基本的には検索の速度をあげるためですが、その他に、Indexを付けた列の一意性の保証、表の結合時のロックや結合の効率化などの効果があります。 いずれにしても、IndexとKeyの組み合わせによって実現されます。(ただし、この辺りの実現はデータベースによって違いますので、PostgreSQLで実装されているかは私は知りません。) あとKeyの方ですが、こちらは、データの管理を楽にするための物です。 例えば、プライマリキーは、その列の一意性の保証と、表結合の際の結合の効率化、外部キーは、参照整合性制約の実現と表結合の効率化などの恩恵が期待できます。

fichi
質問者

お礼

回答ありがとうございます。 大変詳しいアドバイス参考になります。 表結合等はまだ試したことは無いのですが、違うテーブルのデータを結合するのは、スクリプト上でやってしまおうかな、と考えていました。データベースも大変奥が深いですね。 また、質問させていただくこともあるかと思いますが お手すきであれば、また助けてください。 いつか自分も助けてあげられる人になりたく、日々励んでおります。 本当にありがとうございました。

  • x-game
  • ベストアンサー率42% (80/189)
回答No.2

indexをつけるのは検索速度の関係ですよね.indexを日本語に直すと,索引ですので,索引がある本から目的のページを探すのは簡単ですが,索引がない本から自分が探しているページを探すには最初から読むしかないですよね.ということで,indexを使うと検索の速度が上がります.primaryを指定した場合は勝手にindexが作成されるのは検索速度を上げるためです. ただ,更新処理が多い場合はindexをつけることはあまりしません.理由は索引を作り直す必要があるためです.insertやupdateが発生するたびにDBはindexを作り直しています.そのため検索処理が多いようなページをPHPで作成する場合は,検索キーにindexをつけます.updateやinsertが多いページを作る場合はそのDBにindexをつけると逆に遅くなります.

fichi
質問者

お礼

ご回答ありがとうございます。 大変参考になります。 検索を早く処理したいか更新を早く処理したいかを考え どちらの処理が多いのかを考えていくとうまくいくのかな? 実は今まで(趣味で)作成したアプリケーションは、すべてテキストベースでデータを管理していたのですが、この度(会社で)業務用のアプリケーションを作成することになり、あわててデータベースの勉強を始めた次第です。 この様な基本的なことを知っていないと、今後の変更や私以外の者が管理することになったとき迷惑をかけないようにと思い、質問させていただきました。 丁寧な説明、ありがとうございます。

関連するQ&A

  • phpでデータベースのデータ書換え

    現在phpでデータベース(postgresql)を扱える勉強中なんですが、 テーブルの一覧を表示して、そこから指定のレコードを選択して、そのデータを書き換えて上書きしたいのですが、どのようにしたらいいのかお手上げです。 一部分を書き換える方法も分かりましたし、一覧の表示の仕方も分かったのですが、一覧表示から選択し表示したテーブルを、表示だけでなくその状態で書換えできる状態にして、書き換えたレコードを丸ごと上書きしたいのですが、なかなか参考にできるサイトが見つからずに困っています。 おすすめのサイトでもあれば教えていただけないでしょうか。

    • 締切済み
    • PHP
  • PHPとpostgreSQL プルダウンの作成

    いつも大変お世話になっております。 現在、PHPとpostgreSQLを使用し、webシステムの勉強をしていますが、フォームにプルダウンを設置した際の、PHPのデータの受け渡し、また、DBのテーブルへの登録方法がわかりません。プルダウンには選択肢を3つ付ける予定でおります。 postgreSQL側のレコードの作成方法と、PHPを利用しての登録の仕方で困っています。 ご教授のほど、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • データベースが異なるテーブルを連結してSELECTしたい

    データベースが異なるテーブルを連結してSELECTしたいと考えています.(PHPを使用して結果をWEB上に表示したいと考えています.) つまり,2つの異なるデータベースがあり,それぞれのデータベースのテーブルの内容をINNER JOINまたはOUTER JOINで連結したいと考えています. 可能でしょうか? また,MS-Accessのリンク機能と同様な機能をPostgreSQLは持っているのでしょうか? PostgreSQL Ver.7.3.0

  • MSDEのテーブルはどこに作成されているのでしょうか?

    お世話になります。 Access2000+VB.NETからMSDE2000RelAに移行勉強中です。 SQL Web Data Administratorを使用してテーブルを作成して 入力ツールやその他の画面を.NETで作成しました。 今度サーバーにそのデータを移そうと思ってテーブルのパスを 探したんですがよくわかりません。 そういえば作成するときにもどこに作成するのかというドライブ 名もディレクトリも指定しなかった(聞かれなかった)ように 思います。 拡張子は.dboなのでそれをキーに検索しても引っかかりません。 このデータベースファイルを探してコピーしたいのですが、そも そもデフォルトではどこに作成されるのかご教示いただけませんか? よろしくお願いいたします。

  • 文字の検索について

    「test」というデータベースの「shouhin」というフィールドに、次のようなレコードがあった場合、「PHP」というキーワードと「本」というキーワードの両方にマッチしたレコードを抽出したいのですが、自分で試した方法は、下記の2つの方法なのですが、この方法では、マッチさせるキーワードが3個の場合4個の場合を考えると式が複雑になってしまいます。 今やりたいことは、たとえば、googleでの検索のように、「PHP 本」と入力したら、PHPと本の両方のキーワードを含んだレコードを抽出したいのです。「PHP 本 楽しい」なら、この3つのキーワードを含んだレコードといった感じに。 検索したいキーワードを変数(たとえば、$keyword='PHP 本')にいれておいて、これを簡単に実現するsqlの記述の仕方はありますか? ご回答よろしくお願い致します。 ●「test」というデータベースの「shouhin」というフィールドに対して検索 ID |shouhin --+---------- 1 | PHPが書かれた本 2 | この本はPHPが書かれています 3 | 楽しいPHPの本 4 | HTMLの本 --+--------------------------- ●試してみた方法2種類 SELECT * FROM `test` WHERE shouhin REGEXP '(アジアン.*テーブル)|(テーブル.*アジアン)' SELECT * FROM `test` WHERE shouhin LIKE '%アジアン%' and shouhin_name LIKE '%テーブル%'

  • テーブルの情報を取得したい

    テーブルの情報を取得したい PHP5とPostgreSQL8.4.3を使っています。 フォームにテーブル名を入力して送信すると、そのテーブルの情報(カラム名、型名など)が表示され、 そのテーブルに対してレコードの追加や削除を行いたいのですが方法が分かりません。 どなたか分かる方いらっしゃいましたらお願いします。

  • SQLServerのテーブルについて

    今、SQLSERVER上に5200万行ほどのレコードを保持しているテーブルがあるとします。 クエリアナライザで検索条件を指定して検索しても 1時間ほどかかります。 そこでインデックスというものを追加したいのですが、 データ数が多いのか、うまくいきません。 どなたか教えて下さい。 ● hizuke | datetime ● name | varchar count | int area | varchar ●の部分にインデックスを付加したいと考えています。

  • テーブル定義書作成時のIndex付加について

    基礎的なことで申し訳ございませんが、 お力添えよろしくお願いいたします。 CentOs 5 & PostgreSQL 8.4.9にてDB構築しております。 DB構築から、テーブル作成・項目追加・キー設定まで行いまして、 検索する際に、抽出件数が多く負荷のかかりそうなものに Indexを作成しようと考えております。 ■本題  1.Indexを作成する対象となる項目の、目安としてどのようなものが考えられるでしょうか。   ・キー対象の項目になっているもの   ・検索条件の対象となる項目なども当たるでしょうか  2.項目をまとめて一つのIndexにするメリット・デメリットはどのようなものでしょうか   3.テーブル結合したときのIndexの動作    例) 下記のようなテーブルがあった場合 tablea(データ50000件程度) hoge_id pkey1 hoge_no hoge_nm ... tableb(データ150000件程度) test_id pkey1 hoge_id pkey2 hoge_betu_kb ...     select t1.hoge_id, t1.hoge_nm, t2.hoge_betu_kb rom tablea as t1 leftjoin tableb as t2 on t1.hoge_id = t2.hoge_id where t1.hoge_id > '100' and t1.hoge_nm like 'あいう%'   このような場合のIndex作成は、 A. Create index idx_tablea_hoge_id ON tablea (hoge_id); B. Create index idx_tablea_hoge_id ON tablea (hoge_nm); C. Create index idx_tableb_hoge_id ON tableb (hoge_id); ←tableaで指定しているのでこれは不要?  4.A.B.C.のようなIndex作成した際のテーブル定義の書き方   テーブル定義書のフォーマットは定められており、お門違いな質問かとは存じてはおりますが、   テーブル定義にIndex定義を書く場合に、添付した画像のようなフォーマットの書き方が   よく理解できずお気づきの点などございましたら、ご指摘願えたら助かります。   (以前は、CSEツールなどで自動出力される定義書のような書き方をしていたもので・・・)         例)tablea IDX1 IDX2 IDX3 hoge_id 1 hoge_nm 2 このような書き方になるのかどうか?      IDX2, IDX3の項目とは?どのようなIndex定義をした際に書き込むことになるのかが判らず。。。      基礎から勉強しなおすべきとは存じておりますが。。。 現状の期間あまり時間がないことと、 DB構築を一人で行っており、このような内容を相談できるものがおりませんゆえ、 改めて、Index付加することを考えてみると、いまさら聞けないような内容かもしれませんが ちゃんと把握したうえで、テーブル構築したいと思いますので 今までの他の皆様の経験からのノウハウなども踏まえて、 ご教授いただけると大変助かります。

  • すべてのテーブルのすべてのレコードを削除する方法

    データベースを扱うプログラムに対してユニットテストを行いたいと思っています。 それぞれのテストが終了するごとにすべてのテーブル内のすべてのレコードを削除したいのですが、 delete from table_a; delete from table_b; delete from table_c; ... のように書くと、外部キー制約に引っかかってしまい削除できないことがあります。 短いSQL文で複数のテーブル内のレコードをすべて削除する方法はないのでしょうか? よろしくお願いします。 ちなみに、私が現在使っているDBMSはPostgreSQL 8.1です。

  • 実世界とテーブルの関係について

    今、データベースシステムについて勉強しているものです。今回はある参考書に掲載されていた問題でわからないものがあったので質問しました。その問題なのですが二問ありまして・・・ 実世界とテーブルの関係について、以下の問いに答えよ。 1.1 実世界とテーブルの対応関係について説明せよ。 1.2 主キーと外来キーについてのインテグリティ制約が何故必要か説明せよ。 という問題です。この実世界とテーブルとの関係に興味を持ったのですが、まだ勉強し始めということもあり正しい解答がわからないでいます。 わかる方、解答とその解答の解説をしてくださるとうれしいです。お願いいたします!