• ベストアンサー

InnoDBとMyISAMについて

他にも似たような質問はありましたが、質問させてください。 PHP:4.4.4 MySQL:4.1.21 Apache:2.0.58 テーブルを4つ作成予定です。 ・テーブルA→INSERTが中心。SELECTもそこそこ頻繁。 ・テーブルB→INSERT,UPDATEが中心。SELECTもそこそこ頻繁。 ・テーブルC→SELECTがメインだが、UPDATE,INSERTもあり、テーブルDとの整合性が必要。 ・テーブルD→SELECTがメインだが、UPDATE,INSERTもあり、テーブルCとの整合性が必要。 テーブルCとテーブルDをInnoDB, テーブルAとテーブルBをMyISAMにしようと思っていますが、InnoDBは速度が遅いとも書いてあるので心配です。 またInnoDBは運用が面倒だと書いてあるサイトもありましたが、具体的にどう面倒なのかがわかりません。 MySQLのサイトを見る限り、特に面倒な事は無いように感じますが、MyISAMと違って運用面で気をつけることがあるのでしょうか。 教えてください。御願いします。

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

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

  • ベストアンサー
noname#249320
noname#249320
回答No.2

アクセス数にもよりますが, 数万件程度ならインデックスをきちんと張っていれば, MyISAM, InnoDB のどちらでも運用に耐えうると思いますよ。 # インデックスを張っていなくても問題ないかも MyISAM はトランザクションという概念がないので, 異なるデータベースプロセスが テーブルの同じ行を同時にアクセス/更新する場合などに不整合が起こる可能性があります。 アプリケーションがテーブルの同じ行に同時にアクセスするような作りになっていなければ MyISAM でいいですし, 同じ行を同時に参照して更新のような作りになっていたら InnoDB の方がよいでしょう。 # MyISAM でも LOCK などで対応することができますが, 色々面倒です 大雑把に言うと, ・MyISAM は高速だがトランザクションがない ・InnoDB は安全だが MyISAM より遅い という感じです。 InnoDB が MyISAM より遅いとはいっても, きちんと運用すれば 数百万~数千万のデータは普通に扱えますので, 現時点では特にどちらを, ということはないかと思います。

chobi55
質問者

お礼

y-110様、御回答ありがとうございました。大変参考になりました。 今回はInnoDBで作成することにしました。MySQLは使い慣れているオラクル等とは違う点が多々あるので難しいです。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

気にする必要があるのはむしろMyISAMですので InnoDBであれば通常のSQLのつくりをしていれば 大丈夫でしょう。 とくにトランザクションがないMyISAMの場合、 UPDATEに整合性は期待できないことはご周知かと思いますが 運用の仕方である程度カバーできます。 複数で同時接続して、いっせいにデータをUPDATEするような 仕組みでなく、検索中心の小さなDBならばMyISAMのほうが 効率はよいかもしれませんね。 また4.1系であればサブクエリは便利ですが、 無理やり一文にすることでかえって非効率な場合も 考えられます。 場合によってはテンポラリーをつかって複数の SQLでやったほうが処理が速い場合もありますので 十分な検証が必要でしょう。 中級~上級者むけの書籍にはチューニングの仕方なども よくのっているのそれを参考になさるとよろしいかと。

chobi55
質問者

お礼

ありがとうございます。 InnoDBであっても通常の運用で大丈夫なんですね。 複数同時接続でUPDATEなどをしなければ、MyISAMでもトラブルは起きにくいのでしょうか? テーブルA・Bに関しては、INSERTされたものに対してUPDATEとSELECTをかけるので、INSERTは複数同時にありえますが、UPDATE/SELECTは同時には1・2箇所からしか起こりません。 テーブルC・Dは複数同時SELECTはありえますが、テーブルCに関してはINSERT,UPDATEは1箇所からのみ、テーブルDの複数同時INSERT,UPDATEはせいぜい5箇所程度です。 ただし、テーブルDをINSERT,UPDATEする時は、必ずテーブルCのINSERT,UPDATEが発生します。 テーブルC・Dに関してはレコード数は最大100~500件程度です。 テーブルA・Bに関してはレコード数はどんどん増えてはいきますが数万件ということは無いと思います。 それほど大きいDBではないので、MyISAMの方が検索の為にはいいのでしょうか? また、お薦めの書籍がありましたら教えてください。 繰り返しの質問になりますが、御願いします。

関連するQ&A

  • InnoDBとMYISAMとBDBの違い

    Mysqlのテーブルの種類には幾つかあるようですが、InnoDBとMYISAMとBDB--->この3つのそれぞれの特徴を概略で結構ですので教えていただけませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQLのInnoDBテーブルについて

    MySQLのバージョンは4.1.13-ntです。 元々MyISAMテーブルを使用してたんですが、トランザクション機能を使いたいということでInnoDBテーブルに変えたところ、検索に凄く時間がかかるようになりました。データ件数は二百万件ぐらいです。MyISAMテーブル の時は数秒でかえってきたのが、InnoDBテーブルでは何分という結果になりました。 InnoDBは早いと聞いたのですが、データが大量になると遅くなるのでしょうか?ご教授お願い致します。

  • phpMyAdminでのInnoDB設定について

    phpMyAdminでのInnoDB設定について mysqlでInnoDBを使用するため、各テーブルの種別をInnoDBに設定しました。 しかし、phpMyAdminで、データーベースの構造を見ると テーブル |昇順|操作|レコード数| 種別 |照合順序|サイズ|オーバーヘッド hoge             |InnoDB| hoge2             |InnoDB| 2テーブル|  |合計|1,726 |MyISAM| というように、テーブルの種別はInnoDBとなっているのですが、 最後の行にある、各テーブルの合計値が表示されている場所には、 MyISAMと表示されています。 InnoDBを使用する上で、これは問題ないのでしょうか? 教えて頂ければ幸いです。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • XAMPPでテーブルをInnoDBにすることができません

    MySQLの初心者です。お世話になります。 XAMPPを使っています。 ストレージエンジンがInnoDBのテーブルをつくりたく create table tb (a varchar(10)) ENGINE=InnoDB; や alter table tb ENGINE=InnoDB; を試みていますが、MyISAMにしかなりません。 どなたか、解決法等教えていただけないでしょうか。

    • ベストアンサー
    • MySQL
  • phpMyadminでどうしてもinnoDBが有効になりません。

    phpMyadminでどうしてもinnoDBが有効になりません。 ローカル環境 phpMyAdmin - 2.11.4 MySQL クライアントのバージョン: 5.0.51a ストレートエンジンをMyISAMで開発を行っていましたが、 innoDBに変更することにしました。 色んなサイトを拝見しましたが、どうも有効になってくれません。 対処した項目を書きます。 (1) my.cnf内のskip-innodbをコメントアウト (2) 数回XAMPPのコントロールパネルからMySQLを再起動 (3) ログファイルib_logfileの確認 <無し>   (ログファイルが生まれていれば、xampp/mysql/data/ ← この中に生まれますよね?) (4) (3)のログファイルがあれば、それを削除しようと思いましたが見つかりませんので、   無視しました。このログファイルは、my.cnf内のinnodb_log_file_size = デフォルト値を   変更した場合、既に生まれているログファイルのサイズと異なっていらば、エラーとなるらしく、   まあ、一度もinnoDBにてテーブルを作成していないので、ログが生まれるはずもなく・・・    一応ケアーしてみました。 いかがでしょうか? これら以外に、innoDBがphpMyadminで有効になってくれない理由がありますでしょうか? かなりハマッてます・・・。お助け下さい。。

    • ベストアンサー
    • MySQL
  • InnoDBのAuto Incrementsの問題

    今回、InnoDBとMyISAMの Auto Increments(以下AI)の挙動に対する 対処方法についての質問になります。 以前は5.1のMySQLを使用していましたが、 最近利用しているホスティング会社の方で変更があり、 MySQL5.6へのバージョンアップが行われ、 そこから発生している問題です。 例えば testtb ------------- id item ------------- 1 aaa 2 bbb 3 ccc ------------- というテーブルがあります。(InnoDB) idはプライマリーキーでAIが設定されています。 基本的にこのテーブルでは itemのアップデートくらいで、 レコードを削除するような動作は起こりません。 ところが管理者サイドのテストの際に 下記のように、でMAX(id)を抽出してそのレコードを削除し、 AIの値を削除したMAX(id)に変更するという動作が稀に発生します。 $sql = "SELECT max(id) FROM testtb "; $result = mysql_query($sql, $con); $maxid = mysql_result($result, 0); $sql = "DELETE FROM testtb WHERE id = '{$maxid}' "; mysql_query($sql, $con); $sql = "ALTER TABLE testtb AUTO_INCREMENT = {$maxid} "; mysql_query($sql, $con); 要するにテストで登録した最新idのレコードを削除し、 AI値も元に戻してテスト前の状態に復旧するという内容です。 以前のMySQLのバージョンでは これが問題なく動作していましたが、 MySQL5.6に変わってから InnoDBの場合には、 ALTER TABLE testtb AUTO_INCREMENT = {$maxid} このSQL文を実行しても結果が全く反映されません。 phpmyadminからも実行してみましたが 実行結果にエラーはでないのですが、 同様に結果は反映されず、AI値の変更が行われません。 少しググってみて、innodb_autoinc_lock_mode の設定が関係しているのではと思い見てみると innodb_autoinc_lock_mode = 1になっていました。 ちなみにこの値は共有DBのため、 ホスティング会社の方での固有の設定で 私の方で変更はできません。 上記の問題はMyISAMでは発生しませんので、 InnoDB固有の特徴によるものかと思います。 innodb_autoinc_lock_modeの設定変更なしで 上記を解消する方法はありますでしょうか? もうMyISAMで運用するくらいしか方法が見つかりません。 それからこれに関連する内容で もう一つ質問があります。 これはphpmyadminに関する質問なのですが、 以前ですと、テーブルを選んで 上メニューの「操作」という箇所から AIの値が確認できて変更もできたかと思うのですが 現在はAIの値を操作する箇所が全く見当たりません。 確認のためにSHOW TABLE STATUSを実行する以外に 確認・変更のできる場所はありませんでしょうか? ちなみにphpmyadminのバージョンは4.0.0です。 よろしくお願いいたします。

  • AUTO_INCREMENT の値をINSERT前に知りたい

    PHP(PEAR)+MYSQLでWEBアプリを作成しているのですが、AUTO_INCREMENTを設定した値をデータのINSERTを行う前に取得したいのですが、どのようにすればいいのでしょうか?INSERT後であればLAST_INSERT_ID()やmysql_insert_id()で取得できるのは分かっているのですが…。ちなみに現在のテーブル型はInnoDBです。MySQLもしくはPearの命令でお分かりになる方お教えください。よろしくお願いします。

  • InnoDBへの変更でUPDATE処理ははやくなるでしょうか?

    ローカルのパソコンにXAAMPをインストールし そのなかでPHPを使用してとあるデータの処理を行っています。 # MySQL 5.1.41 + PBXT engine # PHP 5.3.1 # phpMyAdmin 3.2.4 使用しているテーブルの概要は以下のような形になっています。 id | URL | DATA | DATE 処理の内容としては PHP上でURLにアクセスしデータを取得、一部のデータを抽出しDATAに挿入(UPDATE)するという形をとっています。 処理の対象となるデータが10万行以上に及ぶため、効率良く処理を行うための様々な方法を探していたのですが、テーブルをMyISAMから行単位のロックが可能なInnoDBに変更し処理を実行しているPHPに複数のコネクションからという考えにいたりました。 私自身あまり理解していないのですが 1.現状のMyISAMではたとえ複数のコネクションからアクセスし、update処理を行ってもテーブル全体にロックがかかっているため単体のコネクションからのアクセスと比べて処理の速度はかわらない。 2.InnoDBは行単位でのロックが可能なため、UPDATE対象の行以外はロックが行われず、複数からのコネクションでアクセスすればより高速に処理が可能 というえ考えで間違いないでしょうか? また、この考えが間違いでないという前提の質問なのですが、実際InnoDBに変更して同じ処理を行ったのですが処理速度はまったく変化ありませんでした。単純にInnoDBに変更しただけではダメなのでしょうか? SQL文自体になにか変更を加える必要があるのでしょうか? わかりにくい質問かもしれませんが よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • バルクINSERT直後に、最後のIncremet値は取得できますか?

    PHPからMySQLへトランザクションを使わずに、 INSERT INTO test (id,count) VALUES (5,5),(6,6) のようにINSERTした直後に、SELECT LAST_INSERT_ID(); としても、5が返却されてしまいます。 これはMySQLの仕様でしょうか? 又、 SELECT LAST_INSERT_ID() ではなく、 SELECT LAST_INSERT_ID() FROM test; のようにテーブル名を指定する方法は何か意味があるのでしょうか? テーブル名を指定すると、テーブルにあるレコード数分 データが返却されてしまいました。。

    • ベストアンサー
    • MySQL
  • DB種別がInnoDBでテーブル種別はMyISAM

    多分、設定の問題ではないかと思うのですが、 DB種別とテーブル種別が異なるデータベースがあるのですが、 想定されるメリットとデメリットを教えてください。 ・DB種別 … InnoDB ・DB内のすべてのテーブル種別…MyISAM ちなみに、照合順序は、 DBだけが、latin1_swedish_ciで、 中のデーブルはすべて utf8_unicode_ci になっています MySQL…5.5

    • ベストアンサー
    • MySQL