ホームページ > バックエンド開発 > PHPチュートリアル > mysqlテーブルカラムのコピー、mysql接続時間とメモリ制御

mysqlテーブルカラムのコピー、mysql接続時間とメモリ制御

WBOY
リリース: 2016-06-13 12:46:23
オリジナル
1027 人が閲覧しました

mysql テーブル列のレプリケーション、mysql 接続時間、メモリ制御。
一時テーブル temp_t とメインテーブル table1 の 2 つのテーブルがあり、どちらも MyISAM で、それぞれに約 28W のレコードがあります。
cron はネットワークから毎分何らかの情報を取得するようにスケジュールし、まずそれを temp_t (頻繁な書き込み) に保存します。
次に、cron は 10 分ごとに temp_t からメイン テーブル table1 に情報をコピーするようにスケジュールします (頻繁に読み取り、10 分ごとに書き込みます)。

temp_t フィールド id (auto_increment)、title (varchar (200))、content (varchar (500))、date (DATETIME)、mykey (tinyint (1) デフォルト 1、これはメインにコピーされたかどうかを判断するために使用されます。テーブル、2)
のコピー後に UPDATE
table1 フィールド ID (auto_increment なし)、タイトル (varchar(200))、内容 (varchar(500))、日付 (DATETIME)


28W レコード、各データ テーブルは約 300MB、各更新には約 2K ~ 3K レコードが必要です。
直接コピーすると、MYSQL の接続時間が長すぎて、MYSQL のパフォーマンスが低下し、Table1 にテーブル ロックのような現象が発生し、Table1 のクエリ時間が大幅に長くなります。

require dirname(__FILE__) . '/../connection.php';<br />
mysql_select_db("news",$connextion);<br />
mysql_query("SET NAMES utf8");<br />
$query = mysql_query("SELECT * FROM temp_t where mykey = '1'");<br />
while($rows = mysql_fetch_array($query)){<br />
	mysql_query("UPDATE temp_t SET mykey='2' WHERE id='".mysql_real_escape_string($rows['id'])."'");<br />
	mysql_query("INSERT INTO table1 (id,title,content,date) values ('".mysql_real_escape_string($rows['id'])."','".mysql_real_escape_string($rows['title'])."','".mysql_real_escape_string($rows['content'])."','".mysql_real_escape_string($rows['date'])."'");<br />
}<br />
mysql_close($connextion);
ログイン後にコピー


そこで、まず temp_t のデータからレコードを読み取り、json 配列として保存してから、そのデータを table1 にコピーしたいのですが、時々「メモリを割り当てられません」というエラーが発生し、サーバー全体がクラッシュします (json 配列です)大きすぎると大量のメモリを消費します)。 PS: php.ini のメモリ制限が 64M に増加しました (しかし、根本的な原因ではなく症状を治療するものだといつも感じています。このようなコピー プロセスはそれほど多くのメモリを必要としません。重要なのは、コードが不合理であるということです) 。


require dirname(__FILE__) . '/../connection.php';<br />
mysql_select_db("news",$connextion);<br />
mysql_query("SET NAMES utf8");<br />
$query = mysql_query("SELECT * FROM temp_t where mykey = '1'");<br />
$jon = array();<br />
while($rows = mysql_fetch_array($query)){<br />
	$jon['a'] = $rows['id'];<br />
	$jon['b'] = $rows['title'];<br />
	$jon['c'] = $rows['content'];<br />
	$jon['d'] = $rows['date'];<br />
	$pjon .= json_encode($jon).',';<br />
}<br />
mysql_close($connextion);<br />
$njso = json_decode('['.substr($pjon,0,-1).']');<br />
foreach($njso as $nx){	<br />
	if($nx->a){<br />
		require dirname(__FILE__) . '/../connection.php';<br />
		mysql_select_db("news",$connextion);<br />
		mysql_query("SET NAMES utf8");<br />
		mysql_query("UPDATE temp_t SET mykey='2' WHERE id='".mysql_real_escape_string($nx->a)."'");<br />
		mysql_query("INSERT INTO table1 (id,title,content,date) values ('".mysql_real_escape_string($nx->a)."','".mysql_real_escape_string($nx->b)."','".mysql_real_escape_string($nx->c)."','".mysql_real_escape_string($nx->d)."'");<br />
		mysql_close($connextion);<br />
	}<br />
}
ログイン後にコピー

それで、エビを助けてください。テーブル情報をコピーするためのもっと経済的なコードはありますか? mysql の接続時間を短くし、メモリ消費量を少なくする必要がありますか?皆さん、ありがとうございました。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート