• ベストアンサー

連番を振る インデックス 付加 理由

こんにちは、 MYSQLの学習を始めた者です。(学習書籍:MySql 入門以前) レコードに連番を振る際に自動連番属性を持たせるためにはテーブルに対してインデックスを付加しないといけないと本に書いてありました。 例)alter table todofuken add index ind1(renban); 何となくは分かるのですが、すっきりしません。 何かこのあたりの事を分かりやすく教えていただけないでしょうか? よろしく御願いします。

  • MySQL
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

自動連番属性を使うには2つのことが必要です。 1.どこまで振ったか管理する。 2.必要な連番の行を高速に探す。   行の登録場所と連番の順序は必ずしも一致しません。 上記を合理的に実現するためのインデックスだと思いますが。 屁理屈でいえばインデックスが無くても出来ないことは無いはずです。

putitpmatp
質問者

お礼

返信ありがとうございます。 お陰様で意味を理解することができました。

その他の回答 (1)

回答No.2

連番を管理するにはどうすればいいかを考えてください。 (1)既存のデータ中の最大値を得る (2)(1)に+1する (3)重複も禁止する (1)を行うのにインデクスが無ければ、母体データを全件検索することになります。100万件のデータがあるなら、インデクスがないと100万件の全数検索を行わないと、最大値が何か分かりません。 インデクスを定義すれば、構造は一般的にB-TREE構造であり、最大値を求める場合に母体データ数が増えても安定した性能を得られます。 重複がないことを保証するにも、インデクスが無ければ、全数検索してチェックする必要があります。

関連するQ&A

  • 連番の質問

    こんにちは MYSQLの勉強始めたばかりなのですけど、よろしくお願いします。 このように連番を作ったのですが、 alter table xxx add renban int; alter table xxx add index index1(renban); alter table xxx modify renban int auto_increment; 順調にできたのですが、#9と#10の二つのフィールドを消去したところで、次の番号が9からではなく、 11からになってしまったのです。 そこで、index1の消去して、新しい連番を作るのに、どうすればいいのか、教えてください。 それとも、次の番号が11ではなく、9になるように、どうすればいいのか、お願いできますか? お願いします。

  • 複数のindexについて

    CREATE TABLE `test` ( `id` INT(8) , `num` INT(8) , 他多数 (省略) ) このようなテーブルがある場合、以下の2種類のインデックスのつけ方にどのような違いがあるのでしょうか? phpmyadminで確認すると、(1)はインデックスが合体しており、(2)はインデックスが個別に分かれています。 (1) ALTER TABLE `test` ADD INDEX ( `id` , `num` ) (2) ALTER TABLE `test` ADD INDEX ( `id` )   ALTER TABLE `test` ADD INDEX ( `num` ) ちなみに、以下のようなSELECT文を用いる場合には、どちらのインデックスが適していますか? SELECT * FROM test WHERE id='●' and num > '△' ( mysql5,MyISAM )

    • ベストアンサー
    • MySQL
  • ユニークキーの設定を消す

    syainテーブルのユニーク属性を消すPHPのソースを教えて下さい。 例えば mysql_query('alter table syain UNIQUE KEY()'); このような文になると思います。

  • 2つの項目が重複するレコードを抽出する方法はありますか?

    MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、 ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`) としても重複データが存在する為、作成できませんでした。 10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLの連番扱い

    アクセス2000では、オートカウントという型が存在するので、 特に意識しなくてもレコードを作成するとカウントされますが MySQLやPostgreSQLでは連番というフィールドを設けた場合、 どのように連番をつけているのでしょうか? 例えば、連番のフィールド名をserialという名前にした場合、 連番のフィールドに値をセットする前に、select max(serial)+1 from table_sample; のように連番の値を求めるのでしょうか?

    • ベストアンサー
    • MySQL
  • mysqlのalter table中のロックについてです。

    mysqlのalter table中のロックについてです。 下記のように、alterでテーブルを再構築中に同じテーブルにinsertが実行された場合、 接続Bのinsertはブロックされるかと思うのですが、テーブルが大きくalterに時間がかかる場合、 タイムアウトなどは発生するのでしょうか。 またもし発生する場合、タイムアウト値の設定などの確認方法はあるのでしょうか。 1.接続A  alter table table1 add columnB int(11) ; 2.接続B(接続Aのalter実行中)  insert into table1(columnA) values('aaa');

    • ベストアンサー
    • MySQL
  • インデックス名の重複(MySQL5.1+Windows2008)

    インデックス名の重複(MySQL5.1+Windows2008) テーブルを次のSQLでコピーしました。 mysql>create table 新テーブル名 like 元テーブル名; インデックスもコピーされたのですが、インデックス名が重複します。 これは、問題ないのでしょうか? 新テーブルにも、同じインデックスを張りたいので、問題がなければこのままにしておきたいと思っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 最適なインデックス作成

    いつもお世話になってます。 下記のSQLがあるとします。 SELECT A.COL3, A.COL4, B.COL5, SUM(A.COL6) -- (5) FROM TABLE1 A INNER JOIN TABLE2 B ON A.COL1 = B.COL1 -- (2) WHERE -- (1) A.COL1 = '1' AND A.COL2 = '2' GROUP BY A.COL3 ,A.COL4 -- (3) ORDER BY A.COL3, A.COL4 -- (4) 番号はSQLが内部処理(絞りこみやソート)される順番とも考えています。 この場合にてインデックスを作成する場合 「TABLE1 A」に IND1(A.COL1,A.COL2,A.COL3,A.COL4,A.COL6) ON TABLE1 の複合インデックスを作成すべきか、それとも番号単位に個別に索引を作成した方が良いのか悩んでいます。 番号単位だと例えば IND1(A.COL1,A.COL2) IND2(A.COL3,A.COL4) IND3(A.COL6) アドバイスなどあればよろしくお願いします。

  • constraint と index の違い

    ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode); CREATE UNIQUE INDEX dist_id_zipcode_key ON distributors (dist_id, zipcode); この二つには違いがあるのでしょうか。

  • MySQLのKey属性「MUL」について

    宜しくお願い致します。 先程気付いたのですが、MySQLのKey属性に「MUL」という指定が入っていました。こんな指定をした覚えが全く無いので、消そうと思い、alter table modify でカラムの属性を変更させてもやっぱり消えないのですが、これはなんなんでしょう?

    • ベストアンサー
    • MySQL