2017-03-15 8 views

答えて

1

あなたが各テーブルをご希望のどんなテーブルエンジン選択するかもしれないのでまあ、これは、正確にエラーではありません。しかし、あなたはこの組み合わせで深刻な問題に陥るかもしれません。 InnoDBはトランザクションをサポートしますが、MyISAMはトランザクションをサポートしません!

どのトランザクションが使用されているかわからない場合:
トランザクションは、クエリグループ内のすべてのクエリが成功したかどうかを確認します。典型的な例は、クライアントが何かを注文し、そのバランスがそれに応じて調整されるということです。ですから、データベース上でこのような何かをしたい:

START TRANSACTION; 
INSERT INTO orders (item, client, price) VALUES ('whatever', 1, 100.00); 
UPDATE clients_credit SET balance = balance - 100.00 WHERE client = 1; 
COMMIT; 

を(トランザクションを終了)START TRANSACTION;COMMIT;内でこれら2つのクエリを置く、INSERTUPDATEが故障した場合に元に戻されていることを、確認します。

ただし、テーブルの1つがMyISAMタイプの場合、このテーブルの変更は取り消されず、データベースは最終的に矛盾した状態になります。

私の提案は、すべてのMyISAMテーブルをInnoDBに変更することです。これを簡単に行うことができます

ALTER TABLE table_name ENGINE=InnoDB; 

上記の問題以外にも、MyISAMはゆっくりと死んでいます。パフォーマンスを向上させるためには、現在のところ大きな違いはなく、行レベルのロックの代わりにテーブルロックのようないくつかの欠点もあります。あなたはこのオンラインでたくさんの情報を見つけることができます。

あなたの混合物の理由は、いくつかのテーブルの作成者が

CREATE TABLE (
... 
) ENGINE=whatever; 

でテーブル作成にエンジンを指定し、他はなかったか、それが忘れられていた可能性が最も高いです。

ただしエンジンが指定されていない場合は、新しいテーブルがInnoDBテーブルとして作成されます

SET GLOBAL default_storage_engine = InnoDB; 

でデフォルトのエンジンを調整することができます。 (このオプションをmy.cnfに入れることもできます)

これをテストするときには、SESSION変数もあることに注意してください。それを調整するか、新しいセッションを開始してください。

+0

これは面白いです、ありがとうございます!私はこれら3つのテーブルが最初にMyISAMになった経緯を知りました。何らかの理由がありますか? –

+1

答えを編集して追加情報を追加しました。 – fancyPants

+1

ありがとうございます。私はちょうど1つのテーブルを更新しました。これは、「使用されているテーブルタイプはFULLTEXTインデックスをサポートしていません」というメッセージを私に与えました。これを変換するために私のバージョンのmysqlを更新する必要があるかのように見えます。 –

関連する問題