0

以下のクエリを使用して、2つのテーブル間でデータを移行しています。テーブルロックの問題が発生したため、テーブルエンジンをMyISAMからInnoDBに変更することを検討しています。どのテーブルでそれを行う必要がありますか?私が書いているテーブルだけですか、それとも私が書いているテーブルと私が読んでいるテーブルの両方ですか?

INSERT INTO table1 (
  field1, field2, field2
)
SELECT
  field1, field2,
  (
    SELECT
      temp.field4
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
    ORDER BY
      temp.something DESC
    LIMIT
      1
  ) + 1 AS field3
FROM
  table2
WHERE
  NOT EXISTS (
    SELECT
      1
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
  )
4

2 に答える 2

3

ロックするもの

場合によります。更新の実行中に新しいデータが書き込まれないようにする場合は、両方のテーブルをロックする必要があります。書き込みの問題である場合は、更新を行っているテーブルのみをロックします。

よくある誤解

MyISAMがロックを実行できないのは間違いです。MyISAMで実行できないのは、行レベルのロックのみです。MyISAMはテーブルを完全にロックすることができます。

次のリストに基づいて乾燥を行ってください。

意思決定ヘルパー

テーブルは、選択されるよりもはるかに多く挿入、削除、および更新されますか?
=> InnoDB

全文検索が必要ですか
=>MyISAM

明確な外部キー制約を優先/要求しますか
=>InnoDB

ディスクスペースまたはRAMは問題ですか?
=> MyISAM

疑っている?
=> MyISAM

勝者はありません。

于 2009-10-09T19:54:40.330 に答える
0

テーブル1をロックする必要があります。誰かが確認できますか?

私はInnodbのみを使用しています。myisamの機能を忘れてしまいました!

いずれにせよ、すべてをInnodbに切り替える必要があります。最近のInnodbは、とにかく読み取りと同じくらい高速です。

于 2009-10-09T19:25:20.807 に答える