Table des matières
回复讨论(解决方案)
Maison développement back-end tutoriel php php的pdo+mysql循环insert效率极低,求解

php的pdo+mysql循环insert效率极低,求解

Jun 23, 2016 pm 01:29 PM

为了实现办公自动化,我做了一个导入学生表到数据库的小东西,运行虽然没问题,但是效率极低,百度遍网络没有发现解决方案,特来求教。
想要实现的功能是:
1,边导入边显示,这个已经实现,但是效果不理想,我想要显示处理结果的时候滚动条始终在最下方这样就能显示最新处理的数据了,下面的代码中我使用了锚点定位,觉得很笨~~~对于这个需求有更好的方法吗?

2,导入时大约前1500条导入非常快,显示的效果也很赞,滚动条狂滚动至最下方(很专业的样子哈),但是到了大约1500条以后就卡壳了,打开数据库select count(*) from stutable,却发现记录是一直在增长,但是页面看上去卡死了,点任何连接都没有响应,同时数据库的行数仍然在增长~~~。这两天百度这个问题,说是InnoDB是行锁并且有事务所以效率比MyIsam低(但是我需要事务,并且好几个项目都在一台服务器上我不能把mysql的引擎改掉)。也有人说用存储过程或事件,但是如果用存储或事件的话就看不到实时处理的效果了。如果要解决的话,我还是希望在当前这个页面就能搞好,因为不能修改my.cnf等之类的配置文件~~~~

主要是第二个问题,折磨了我两天,求解~~~~还有不知道这个问题发在本版好还是数据库版好~~~
先上代码:

<?phpinclude("conn.php");?><!DOCTYPE html><html><head>	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />	<title>批量导入</title></head><body><table>    	<thead>		<tr><th colspan=2>批量导入学生信息</th></tr>		<tr><td>姓名</td><td>导入结果</td></tr>	</thead>	<tbody><?php//因为导入数据可能占用较长时间,因此设置超时时间为0set_time_limit(0);//将信息写入数据库function addstu($stuname){	global $db;	if($db->exec("insert into stutable(stuname) values('".$stuname."')")=="1")	{		return "导入成功!";	}	else	{		return "导入失败!";	}}//上传部分不写了,只写插入过程if($_POST){	//文件导入	if($_FILES["stuinfo"]["error"]>0)	{		echo "<tr><td colspan='3'>上传文件出错,错误信息:".$_FILES["stuinfo"]["error"]."</td></tr>";	}	else	{		$extension=pathinfo($_FILES["stuinfo"]["name"],PATHINFO_EXTENSION);//获取上传文件的扩展名		$filename="upload/".time().".".$extension;//上传后的文件名		move_uploaded_file($_FILES["stuinfo"]["tmp_name"],$filename);//将上传的临时文件移动到指定目录		$file=fopen($filename,"r");//打开文件,然后读取信息		$stuinfo=array();		while($data=fgetcsv($file))		{			array_push($stuinfo,implode($data));		}		fclose($file);	}	//遍历数组,向数据库insert数据	print str_repeat(" ",4096);//想实现导入的同时显示进度,先输出一堆空字符	foreach($stuinfo as $rs)	{		$addresult="";		$addresult="<tr><td><a name='".$rs."'></a>".$rs."</td><td>".addstu($rs)."</td><tr>";//直接调用addstu方法向数据库写数据		$addresult.="<script type='text/javascript'>location.href='#".$rs."';</script>";//想实现导入的同时滚动条始终在最下方,想不到别的方法,只得用锚点定位。请问有更好的方法吗?		echo $addresult;//输出当前的操作		ob_flush(); 		flush();		usleep(1000);//当时无论如何都实现不了边导入边显示,后来加了个sleep就行了,百思不解,请指点	}}?>	</tbody></table></body></html>
Copier après la connexion


回复讨论(解决方案)

无论是 InnoDB 还是 MyIsam,表类型都是针对表的

你这种即时显示方式是构建在一个 web 系统缺陷上的,换一个环境可能就完全无效了

你输出的数据中 tr 标记未封闭,即使能显示,也是有问题的
你的 表行是输出到 table 标记中呢,还是标记外?
在外显然是不对的,在内的话你的 table 闭标记又在哪呢

哇版主好认真~!!!我自己还检查了一遍,也没发现把写成了~~~~看来我还真是太粗心了!

循环输出的是输出到table内,但是因为循环的缘故,只能是循环完成后最后才能封闭table

版主大大,还有更好的即时显示方式吗?难道要在循环中echo "<script>$.get()</script>"这种方式也就是在PHP的循环中使用jq来从另一个页面提交数据然后将回执写在table中?

最主要的是导入效率问题,导入到1500条左右的时候,页面完全就卡死了,但是数据库的行数还是在增加的。我不清楚是php导致页面卡死还是向数据库插入数据导致页面卡死?

求解惑

一般的说,标记未封闭时,标记的内容是不会显示的
所以你应该用 div 而不是 table 显示内容,况且 IE 中的 table 是只读的
换一种方式(比如 ajax)显然要比你现在的要好,至少不需要人为的使程序每插入一条就挂起1毫秒

经过测试发现,浏览器不是在Insert过程中卡死的,我把insert语句注释,单纯显示“导入成功”字符,也会卡死
看来是在php的foreach中卡死的
难道浏览器不能显示这么多信息?
有没有解决方法?

像这种需求我一般是用前端的ajax循环请求,每次处理n个,返回成功后显示在页面中,然后再请求
个人觉得web就是适合小任务高并发,就像GPU不能处理CPU的运算一样

像这种需求我一般是用前端的ajax循环请求,每次处理n个,返回成功后显示在页面中,然后再请求
个人觉得web就是适合小任务高并发,就像GPU不能处理CPU的运算一样



这个我测试过,如果数据很多,浏览器也会卡死,我是用jquery获取处理的数据,然后$.append将返回信息显示,数据多了也会卡死


像这种需求我一般是用前端的ajax循环请求,每次处理n个,返回成功后显示在页面中,然后再请求
个人觉得web就是适合小任务高并发,就像GPU不能处理CPU的运算一样



这个我测试过,如果数据很多,浏览器也会卡死,我是用jquery获取处理的数据,然后$.append将返回信息显示,数据多了也会卡死



有2个需要注意的地方:
不要连续发请求,采用回调的方式,当第一组数据处理+显示完成后,再发起第二组数据的请求
如果数据量太大,就给显示数据条数定个上限,当达到上限时,再有新数据,就先删掉等量的最老的数据

这样做之后肯定不会卡的

如果你的需求就是把上万的数据一并显示在窗口中的话,就要考虑js缓存然后动态变化显示内容了
首先把全部数据保存在js变量中,把前100条打印出来,然后绑定个页面滚动事件,到底了自动刷出来新的100条,把老的删除
归根到底就是不要创建过多DOM元素

估计浏览器把内存都占了。所以后面解释就慢,你创建了太多dom了。

定位到最底可以不用描点实现,可以用js,修改scrolltop=scrollheight来实现。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title></title></head><body><script type="text/javascript">function add(){var now = new Date();var div = document.getElementById('scrolldIV');div.innerHTML = div.innerHTML + 'time_' + now.getTime() + '<br />';div.scrollTop = div.scrollHeight;}</script><span class="notice">请点击“插入一行”按钮,插入最新信息,当出现滚动条时,滚动条将自动保持在底部。</span><br /><div id="scrolldIV" style="overflow:auto; height: 100px; width: 400px; border: 1px solid #999;"></div><input type="button" value="插入一行" onclick="add();"></div></div></body></html>
Copier après la connexion

回复楼上版主,为什么变慢我还是不清楚原因,不知道是因为创建的DOM太多缘故还是PHP代码缘故。

不过我现在的方案是:使用jquery的$().append()方法回显,效果不错。

感谢大家热心回复,结贴

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment écrire un algorithme pour trouver le plus petit commun multiple en Python ? Comment écrire un algorithme pour trouver le plus petit commun multiple en Python ? Sep 19, 2023 am 11:25 AM

Comment écrire un algorithme pour trouver le plus petit commun multiple en Python ? Le plus petit commun multiple est le plus petit entier entre deux nombres pouvant diviser les deux nombres. En mathématiques, la résolution du plus petit commun multiple est une tâche mathématique de base, et en programmation informatique, nous pouvons utiliser Python pour écrire un algorithme permettant de résoudre le plus petit commun multiple. Ce qui suit présentera l’algorithme multiple de base le moins courant et donnera des exemples de code spécifiques. La définition mathématique du plus petit commun multiple est la suivante : si a est divisible par n et b est divisible par n, alors n est le plus petit commun multiple de a et b. Pour résoudre le minimum

Un moyen rapide de calculer l'inverse d'une matrice - Implémentation Numpy Un moyen rapide de calculer l'inverse d'une matrice - Implémentation Numpy Jan 24, 2024 am 08:47 AM

Numpy est une bibliothèque informatique scientifique bien connue en Python, qui fournit des fonctions riches et des méthodes informatiques efficaces pour traiter de grands tableaux et matrices multidimensionnels. Dans le monde de la science des données et de l’apprentissage automatique, l’inversion matricielle est une tâche courante. Dans cet article, je vais présenter comment résoudre rapidement l'inverse de la matrice à l'aide de la bibliothèque Numpy et fournir des exemples de code spécifiques. Tout d'abord, introduisons la bibliothèque Numpy dans notre environnement Python en l'installant. Numpy peut être installé dans le terminal à l'aide de la commande suivante : pipinsta

Utiliser la programmation en langage C pour résoudre le plus grand diviseur commun Utiliser la programmation en langage C pour résoudre le plus grand diviseur commun Feb 21, 2024 pm 07:30 PM

Titre : Utilisez la programmation en langage C pour implémenter la solution du plus grand diviseur commun. Le plus grand diviseur commun (Greatest Common Divisor, GCD en abrégé) fait référence au plus grand entier positif qui peut diviser deux entiers ou plus en même temps. La recherche du plus grand diviseur commun peut être très utile pour certains algorithmes et la résolution de problèmes. Dans cet article, la fonction de recherche du plus grand diviseur commun sera implémentée via la programmation en langage C, et des exemples de code spécifiques seront fournis. En langage C, vous pouvez utiliser l'algorithme euclidien pour résoudre le maximum

Comment utiliser Python pour implémenter l'algorithme de résolution factorielle ? Comment utiliser Python pour implémenter l'algorithme de résolution factorielle ? Sep 19, 2023 am 10:30 AM

Comment utiliser Python pour implémenter l'algorithme de résolution factorielle ? Factorielle est un concept important en mathématiques. Elle fait référence à un nombre multiplié par lui-même moins un, puis multiplié par lui-même moins un, et ainsi de suite jusqu'à ce qu'il soit multiplié par 1. La factorielle est généralement représentée par le symbole "!". Par exemple, la factorielle de 5 est exprimée par 5!, et la formule de calcul est : 5!=5×4×3×2×1=120. En Python, nous pouvons utiliser des boucles pour implémenter un algorithme factoriel simple. Un exemple de code est donné ci-dessous : deffacto

Apprenez à trouver le plus grand diviseur commun en langage C Apprenez à trouver le plus grand diviseur commun en langage C Feb 21, 2024 pm 11:18 PM

Pour savoir comment trouver le plus grand diviseur commun en langage C, vous avez besoin d'exemples de code spécifiques. Le plus grand diviseur commun (Greatest Common Divisor, GCD en abrégé) fait référence au plus grand entier positif parmi deux ou plusieurs entiers pouvant les diviser. Le plus grand dénominateur commun est souvent utilisé en programmation informatique, en particulier lorsqu'il s'agit de traiter des fractions, de simplifier des fractions et de résoudre des problèmes tels que le rapport le plus simple d'entiers. Cet article explique comment utiliser le langage C pour trouver le plus grand diviseur commun et donne des exemples de code spécifiques. Il existe de nombreuses façons de résoudre le plus grand diviseur commun, comme Euclidien

Écrire un programme pour résoudre des équations modulaires en C/C++ ? Écrire un programme pour résoudre des équations modulaires en C/C++ ? Sep 12, 2023 pm 02:21 PM

Ici, nous verrons un problème intéressant lié aux équations modulaires. Disons que nous avons deux valeurs A et B. Il faut trouver le nombre de valeurs possibles que la variable X peut prendre telles que (AmodX)=B soit vraie. Supposons que A vaut 26 et B vaut 2. La valeur préférée de X serait donc {3,4,6,8,12,24}, d'où le nombre de 6. C'est la réponse. Jetons un coup d'œil à l'algorithme pour mieux comprendre. Algorithme possibleWayCount(a,b)−begin sia=b, alors il y a des solutions infinies sia

Programme C/C++ pour trouver le nième nombre de Fibonacci ? Programme C/C++ pour trouver le nième nombre de Fibonacci ? Sep 12, 2023 pm 06:01 PM

La suite de Fibonacci est une suite de nombres dont le terme suivant est la somme des deux termes précédents. Les deux premiers termes de la suite de Fibonacci sont 0 suivi de 1. Dans ce problème, nous trouverons le nième nombre de la séquence de Fibonacci. Pour ce faire, nous allons compter tous les nombres et imprimer n éléments. Entrée : 8 Sortie : 011235813 Description 0+1=11+1=21+2=32+3=5 Utilisez une boucle For pour additionner les deux premiers éléments comme élément suivant Exemple #include<iostream>usingnamespacestd;intmain(){ intt1 = 0,t2=1,n,i,termesuivant;&am

Comment résoudre des puissances de 2 en PHP ? Comment résoudre des puissances de 2 en PHP ? Mar 28, 2024 am 11:09 AM

Titre : Comment résoudre des puissances de 2 en PHP ? Des exemples de code spécifiques sont partagés dans la programmation PHP. Résoudre la puissance des nombres est une exigence courante, en particulier dans certains algorithmes et calculs mathématiques. Cet article expliquera en détail comment résoudre la puissance de 2 en PHP et fournira des exemples de code spécifiques pour votre référence. En PHP, vous pouvez utiliser l'opérateur d'exponentiation ** pour calculer les puissances. Pour des puissances de 2, calculez $2^n$, où $n$ est l'exposant de la puissance. Ci-dessous, nous mettrons en œuvre ce calcul de différentes manières. Méthode 1 : Utilisez ** chance

See all articles