对于PHP使用PDO从mysql读取大量数据处理详解感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍phppdomysql,并为您提供关于C#在MySQL大量数据下的高效读取、写入详解、MySQ
对于PHP使用PDO从mysql读取大量数据处理详解感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍php pdo mysql,并为您提供关于C#在MySQL大量数据下的高效读取、写入详解、MySQL是否适合具有3.5米行的读取大量数据库?如果是这样,哪个发动机?、mysql读取大数据量、PHP PDO从mysql获取数据并回显它们的有用信息。
本文目录一览:- PHP使用PDO从mysql读取大量数据处理详解(php pdo mysql)
- C#在MySQL大量数据下的高效读取、写入详解
- MySQL是否适合具有3.5米行的读取大量数据库?如果是这样,哪个发动机?
- mysql读取大数据量
- PHP PDO从mysql获取数据并回显它们
PHP使用PDO从mysql读取大量数据处理详解(php pdo mysql)
前言
本文主要介绍了关于PHP利用PDO从MysqL读取大量数据处理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
环境
- MysqL: 5.6.34
- PHP: 5.6
- Nginx: PHP-fpm
适用场景
需要处理一定数据集业务
- 从MysqL读取一定数据的业务导出
- 一次需要处理一定的MysqL业务操作更新删除等
- 更多需要处理一定数据集的操作
pdo 关键设置
生成器
生成器,迭代数据操作
本生成器可省略
尝试代码
$newLine = PHP_SAPI == 'cli' ? "\n" : '
';
foreach ($this->cursor($sth) as $row) {
// var_dump($row);
echo $row['id'] . $newLine;
$i++;
}
echo "消耗内存:" . (memory_get_usage() / 1024 / 1024) . "M" . $newLine;
echo "处理数据行数:" . $i . $newLine;
echo "success";
}
public function cursor($sth)
{
while($row = $sth->fetch(\PDO::FETCH_ASSOC)) {
yield $row;
}
}
}
$test = new test();
$test->test();
输出
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小编的支持。
C#在MySQL大量数据下的高效读取、写入详解
前言
C#操作MysqL大量数据最常见的操作便是 select 读取数据,然后在C#中对数据进行处理, 完毕后再插入数据库中。 简而言之就 select -> process -> insert 三个步骤。 对于数据量小的情况下(百万级别 or 几百兆)可能
最多1个小时就处理完了。但是对于千万级数据可能几天,甚至更多。 那么问题来了,如何优化??
第一步 解决读取的问题
跟数据库打交道的方式有很多,我来列举下吧:
1. 【重武器-坦克大炮】使用重型ORM框架,比如 EF,NHibernat 这样的框架。
2. 【轻武器-AK47】 使用 Dapper,PetaPoco 之类,单cs文件。灵活高效,使用简单。居家越货必备(我更喜欢PetaPoco :))
3. 【冷兵器?匕首?】使用原生的Connection、Command。 然后写原生的sql语句。。
分析:
【重武器】在我们这里肯定直接被PASS, 他们应该被用在大型项目中。
【轻武器】 Dapper,PetaPoco 看过源码你会发现用到了反射,虽然使用 IL和缓存技术 ,但是还是会影响读取效率,PASS
好吧那就只有使用匕首, 原生sql 走起, 利用 DataReader 进行高效读取,并且使用 索引 取数据(更快),而不是列名。
大概的代码如下:
using (var conn = new MysqLConnection("Connection String...")) { conn.open(); //此处设置读取的超时,不然在海量数据时很容易超时 var c = new MysqLCommand("set net_write_timeout=9999999; set net_read_timeout=9999999",conn); c.ExecuteNonQuery(); MysqLCommand rcmd = new MysqLCommand(); rcmd.Connection = conn; rcmd.CommandText = @"SELECT `f1`,`f2` FROM `table1`"; //设置命令的执行超时 rcmd.CommandTimeout = 99999999; var myData = rcmd.ExecuteReader(); while (myData.Read()) { var f1= myData.GetInt32(0); var f2= myData.GetString(1); //这里做数据处理.... } }
哈哈,怎么样,代码非常原始,还是使用索引来取数据,很容易出错。 当然一切为了性能咱都忍了
第二步 数据处理
其实这一步,根据你的业务需要,代码肯定不一, 不过无非是一些 字符串处理 , 类型转换 的操作,这时候就是考验你的C#基础功底的时候了。 以及如何高效编写正则表达式。。。
具体代码也没法写啊 ,先看完 CLR via C# 在来跟我讨论吧 ,O(∩_∩)O哈哈哈~ 跳过。。。。
第三部 数据插入
如何批量插入才最高效呢? 有同学会说, 使用 事务 啊,BeginTransaction,然后EndTransaction。 恩,这个的确可以提高插入效率。 但是还有更加高效的方法,那就是合并insert语句。
那么怎么合并呢?
insert into table (f1,f2) values(1,'sss'),values(2,'bbbb'),values(3,'cccc');
就是把values后面的全部用逗号,链接起来,然后一次性执行 。
当然不能一次性提交个100MB的sql执行,MysqL服务器对每次执行命令的长度是有限制的。 通过 MysqL服务器端的 max_allowed_packet 属性可以查看, 默认是 1MB
咱们来看看伪代码吧
//使用StringBuilder高效拼接字符串 var sqlBuilder = new StringBuilder(); //添加insert 语句的头 string sqlHeader = "insert into table1 (`f1`,`f2`) values"; sqlBuilder.Append(sqlHeader); using (var conn = new MysqLConnection("Connection String...")) { conn.open(); //此处设置读取的超时,不然在海量数据时很容易超时 var c = new MysqLCommand("set net_write_timeout=9999999; set net_read_timeout=9999999",conn); c.ExecuteNonQuery(); MysqLCommand rcmd = new MysqLCommand(); rcmd.Connection = conn; rcmd.CommandText = @"SELECT `f1`,`f2` FROM `table1`"; //设置命令的执行超时 rcmd.CommandTimeout = 99999999; var myData = rcmd.ExecuteReader(); while (myData.Read()) { var f1 = myData.GetInt32(0); var f2 = myData.GetString(1); //这里做数据处理.... sqlBuilder.AppendFormat("({0},'{1}'),",f1,AddSlash(f2)); if (sqlBuilder.Length >= 1024 * 1024 * 1024)//当然这里的1MB length的字符串并不等于 1MB的Packet。。。我知道:) { insertCmd.Execute(sqlBuilder.Remove(sqlBuilder.Length-1,1).ToString())//移除逗号,然后执行 sqlBuilder.Clear();//清空 sqlBuilder.Append(sqlHeader);//在加上insert 头 } } }
好了,到这里 大概的优化后的高效查询、插入就完成了。
总结
总结下来,无非2个关键技术点, DataReader、sql合并, 都是一些老的技术啦。其实,上面的代码只能称得上高效, 但是, 却非常的不优雅。以上就是这篇文章的全部内容了,希望本文的内容对大家能有所帮助,如果有疑问大家可以留言交流。
MySQL是否适合具有3.5米行的读取大量数据库?如果是这样,哪个发动机?
我对数据库的经验是使用相当小的Web应用程序,但现在我正在处理整个州的选民信息数据集.有大约350万选民,我需要根据他们的地址,投票历史,年龄等进行相当多的报道.网络应用程序本身将用Django编写,所以我有一些数据库选择,包括MySQL和Postgresql.
在过去,我几乎完全使用MysqL,因为它很容易获得.我意识到表中的3.5米行并不是真的那么多,但它是我个人使用过的最大的数据集,所以我不在我个人的舒适区.此外,这个项目不是一个快速丢弃的应用程序,所以我想确保我选择最适合工作的数据库而不仅仅是我最熟悉的数据库.
如果MysqL是适合这项工作的工具,我也想知道使用InnoDB或MyISAM是否合理.我理解两者之间的基本差异,但是有些消息来源说使用MyISAM来提高速度,但是如果你想要一个“真正的”数据库则使用InnoDB,而其他人则说MysqL的所有现代用途都应该使用InnoDB.
谢谢!
InnoDB支持更好的锁定语义,因此如果偶尔或频繁写入(或者如果你想要更好的数据完整性),我建议从那里开始,然后在你无法达到性能目标的情况下对myisam进行基准测试.
mysql读取大数据量
背景
程序启动时,从mysql读取所有的数据,在内存中建立数据结构。mysql表中至少有100w条记录。以后根据时间定期从mysql增量读取数据,刷新内存结构。 表结构为{uid, product, state, modify_time,primary key(uid, product), key(modify_time)}
方法一
因为增量的更新都是按照modify_time来的,所以直观的想到根据modify_time来分页读取,每次读取1w行记录,循环100次就能全部读取100w条记录。 于是select * from table order by modify_time limit 0,10000 直到limit 990000,10000。乍一看没什么问题。但是程序启动居然超过5分钟。用explain分析一下select语句的耗时,发现limit 990000, 10000时居然耗时几秒钟,确实用到了索引modify_time,但是扫描行数超过了5万多行。omg. 对于大数据量时,同一索引下有太多的数据,越往后查找越耗时。100w后数据就已经使系统不可用了。
方法二
表结构加一个字段,id自增类型,并建立唯一索引。查询语句变成select * from table where id >=m and id <n.同样是每次读取1w条数据,但每次都得很快的返回结果,避免了分页limit查询时的急剧下降的性能。 结论
从mysql查询时要避免limit m,n, 当m很大时。
PHP PDO从mysql获取数据并回显它们
通常我会做这样的事情
$qry = "SELECT text_beschreibung FROM magical_moments_text";
$stmt = $conn->prepare($qry); # good practice on using prepared stmt
$stmt->execute();
$result = $stmt->get_result();
然后循环$ result
while ($row = $result->fetch_assoc()) {
echo("<p>The following code should give me ". $row['text_beschreibung'] ."</p>");
}
今天关于PHP使用PDO从mysql读取大量数据处理详解和php pdo mysql的介绍到此结束,谢谢您的阅读,有关C#在MySQL大量数据下的高效读取、写入详解、MySQL是否适合具有3.5米行的读取大量数据库?如果是这样,哪个发动机?、mysql读取大数据量、PHP PDO从mysql获取数据并回显它们等更多相关知识的信息可以在本站进行查询。
本文标签: