2

次の領収書を使用して評価場所テーブルを生成しようとしています

評価に場所を割り当てる(MySQL、PHP)

しかし、私のデータベースは高負荷です。

テーブルを作成しないようにしましたが、MEMORY TABLEを使用し、次のSQLクエリを使用して更新します

トップスに挿入(uid)ユーザーからuidを選択し、expdescで並べ替えます。

しかし、次のMySQLエラーが発生しました

ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してみてください

SQLselectが実行されるまでクエリが多すぎるためです。

この問題を解決する方法は?

PS CREATE TABLEは、サーバーの負荷が高いことを除いて、SELECTとしてほぼ正常に機能します...負荷平均まで:トップが非メモリテーブルの場合は50。

私のテーブルユーザーには、450万行近くあります。

アドバイスありがとうございます。

4

2 に答える 2

0
  1. MEMORY テーブルは MYISAM のようにテーブル ロックを処理することに注意してください (どちらも完全なテーブル ロックを行います)。

450 万行は、select から実行する大量の挿入です。ユーザー テーブル データをチャンクでプルダウンし、バッチ挿入を行うスクリプトを作成するのが良い方法だと思います。

于 2011-07-22T02:33:41.770 に答える
0

InnoDB高い同時実行性が必要な場合は、メモリ テーブルの代わりに使用できます。

InnoDB行レベルのロックMVCC (Multiversion Concurrency Control) をサポートしています。これが必要だと思います。(挿入/更新時)より高速になりますが、デッドロックが頻繁に発生する場合は、それMemoryが最適です。MyISAMInnoDB

InnoDB が高負荷時にパフォーマンスの問題を引き起こしている場合、それはインデックスの断片化とページ分割が多すぎることが原因である可能性が最も高いです。この問題は、定期的ALTER TABLE innodb_tbl_name ENGINE=InnoDBにテーブルを再構築し、最適なパフォーマンスを得るためにインデックスを再構築することで解決できます。

于 2011-07-22T02:57:06.157 に答える