搜索
首页后端开发php教程mysql表列复制,mysql连接时间和内存控制。

有两个表临时表temp_t,和正表table1,都是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) Default 1, 这个来判别是否已经复制到正表,复制过后UPDATE为2)

table1字段 id(没有auto_increment),title(varchar(200)),content(varchar(500)),date(DATETIME)


28W记录,每个数据表大概有300MB,每次更新差不多要2K-3K条记录。
如果直接复制的话,MYSQL连接时间过长,导致MYSQL性能下降table1会出现类似于锁表的现象,查询table1的时间明显加长

require dirname(__FILE__) . '/../connection.php';mysql_select_db("news",$connextion);mysql_query("SET NAMES utf8");$query = mysql_query("SELECT * FROM temp_t where mykey = '1'");while($rows = mysql_fetch_array($query)){	mysql_query("UPDATE temp_t SET mykey='2' WHERE id='".mysql_real_escape_string($rows['id'])."'");	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'])."'");}mysql_close($connextion);



于是想先把记录从temp_t里的数据先读出来,存为一个json数组,然后再复制数据到table1,但是有时会遇到Cannot allocate memory,然后导致整个服务器崩溃(是不是这个json数组太大,占了巨量的内存)。PS:已经在php.ini里将memory limit加到64M了(但总觉得治标不治本,这么一个复制过程,不需要那么多内存,关键还是代码不合理)。

require dirname(__FILE__) . '/../connection.php';mysql_select_db("news",$connextion);mysql_query("SET NAMES utf8");$query = mysql_query("SELECT * FROM temp_t where mykey = '1'");$jon = array();while($rows = mysql_fetch_array($query)){	$jon['a'] = $rows['id'];	$jon['b'] = $rows['title'];	$jon['c'] = $rows['content'];	$jon['d'] = $rows['date'];	$pjon .= json_encode($jon).',';}mysql_close($connextion);$njso = json_decode('['.substr($pjon,0,-1).']');foreach($njso as $nx){		if($nx->a){		require dirname(__FILE__) . '/../connection.php';		mysql_select_db("news",$connextion);		mysql_query("SET NAMES utf8");		mysql_query("UPDATE temp_t SET mykey='2' WHERE id='".mysql_real_escape_string($nx->a)."'");		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)."'");		mysql_close($connextion);	}}


所以求助大虾们,有没有更节省的代码用来复制表的信息?要求mysql连接时间短,内存消耗又少?谢谢大家。


回复讨论(解决方案)

依次执行这两句就可以了
INSERT INTO table1 (id,title,content,date) values
  SELECT id, title,content,date from temp_t where mykey = '1'

UPDATE temp_t SET mykey='2' WHERE mykey = '1'

不需劳驾 php 转交

既然 temp_t 是临时存放,那么转移后的数据为何不删除呢?

依次执行这两句就可以了
INSERT INTO table1 (id,title,content,date) values
  SELECT id, title,content,date from temp_t where mykey = '1'

UPDATE temp_t SET mykey='2' WHERE mykey = '1'

不需劳驾 php 转交

既然 temp_t 是临时存放,那么转移后的数据为何不删除呢?

temp_t的数据还不能删,insert时还有一个判断,就是title不重复(避免重复插入)
按照老大的意思,这样执行就可以了?还没测试,得停掉cron脚本。
弱弱的问一句,依老大的经验,300MB数据表,像这样一次插入2000-3000条记录,这个脚本大概要运行多长时间,耗费多少内存?是不是my.cnf里要增加某些值的内存,用来加速INSERT和SELECT的执行时间?再次感谢。

require dirname(__FILE__) . '/../connection.php';mysql_select_db("news",$connextion);mysql_query("SET NAMES utf8");$query = mysql_query("INSERT INTO table1 (id,title,content,date) values SELECT id, title,content,date from temp_t where mykey = '1'");$query = mysql_query("UPDATE temp_t SET mykey='2' WHERE mykey = '1'");}mysql_close($connextion);

1:首先临时表,又没对外读取?如果有为啥不memcache,然后table1在去读取memcache回来?

2:300m 不算大吖。别人文学站,冬不冬一个表就上10G的。一样复制来去。

3:以前公司做个项目,1个表就400万条数据,采用的方法,从临时表里,1条1条的读取,慢慢读,不用把所有事情挤在一起来出来,这样虽然是时时刻刻的运行着,总共比卡死好吖。

1:首先临时表,又没对外读取?如果有为啥不memcache,然后table1在去读取memcache回来?

内存本来就不够,还装memcache……人家是nginx服务器集群,俺这块是几十元的虚拟空间……

10G的表复制,是不是my.cnf里需要增加某些值的大小?
总感觉自己的表300M运行速度慢,还经常卡死。人家天文数字,频繁读写的照样工作顺畅。


1:首先临时表,又没对外读取?如果有为啥不memcache,然后table1在去读取memcache回来?

内存本来就不够,还装memcache……人家是nginx服务器集群,俺这块是几十元的虚拟空间……

10G的表复制,是不是my.cnf里需要增加某些值的大小?
总感觉自己的表300M运行速度慢,还经常卡死。人家天文数字,频繁读写的照样工作顺畅。


那你是用第三条好点,无论你多大多复杂的数据,1条1条的来。1-2秒1条,1天下来也很恐怖了。
没必要一次倒那么多出去的,如果非的一次倒,多大的集团公司也不敢这样做的。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何在PHP中创建和使用接口?您如何在PHP中创建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解释了如何创建,实施和使用PHP中的接口,重点关注其对代码组织和可维护性的好处。

crypt()和password_hash()有什么区别?crypt()和password_hash()有什么区别?Apr 30, 2025 pm 03:39 PM

本文讨论了PHP中的crypt()和password_hash()之间的差异,以进行密码哈希,重点介绍其实施,安全性和对现代Web应用程序的适用性。

如何防止PHP中的跨站点脚本(XSS)?如何防止PHP中的跨站点脚本(XSS)?Apr 30, 2025 pm 03:38 PM

文章讨论了通过输入验证,输出编码以及使用OWASP ESAPI和HTML净化器之类的工具来防止PHP中的跨站点脚本(XSS)。

PHP中的自动加载是什么?PHP中的自动加载是什么?Apr 30, 2025 pm 03:37 PM

自动加载PHP会在需要时自动加载类文件,从而通过减少内存使用和增强代码组织来提高性能。最佳实践包括使用PSR-4和有效组织代码。

什么是PHP流?什么是PHP流?Apr 30, 2025 pm 03:36 PM

PHP流通过一致的API统一处理文件,网络插座和压缩格式等资源的处理,从而提高复杂性并增强代码灵活性和效率。

可以使用PHP上传的文件的最大大小是多少?可以使用PHP上传的文件的最大大小是多少?Apr 30, 2025 pm 03:35 PM

本文讨论了在PHP中管理文件上传大小的管理,重点是2MB的默认限制以及如何通过修改PHP.INI设置来增加它。

PHP中的无效类型是什么?PHP中的无效类型是什么?Apr 30, 2025 pm 03:34 PM

本文讨论了PHP 7.1中引入的PHP中的无效类型,允许变量或参数为指定类型或NULL。它突出显示了诸如提高可读性,类型安全性和明确意图的好处,并解释了如何声明

unset()和unlink()函数之间有什么区别?unset()和unlink()函数之间有什么区别?Apr 30, 2025 pm 03:33 PM

本文讨论了unset()和unlink()功能在编程中的差异,重点关注其目的和用例。 unset()从内存中删除变量,而unlink()从文件系统中删除文件。两者都对效率至关重要

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具