关于”增”:
需要在表中插入大量测试数据时,譬如10000000条,怎么样插才能更快呢,看一下测试过程吧;
首先,在windows平台下,表中两个字段,id主键自增,name为固定字符串, 一次插一条:
for ($i = 0; $i < 10000000; $i++) {
$db->exec("INSERT INTO test(id, name) VALUES(NULL, 'str')");
}
实际过程中非常慢,我没等到插到10000000就结束了代码的运行,后来搜索了一下,发现可以一次插入多行数据:
"INSERT INTO test(id, name) VALUES(NULL 'str1'),(NULL, 'str2'),(NULL, 'str3')...";
于是乎插入数据代码变成了
for($i = 0; $i < 4500; $i++) {
if ($i == 0) {
$sql = "INSERT INTO test3(id, name) VALUES(NULL, 'str')";
} else {
$sql .= ",(NULL, 'str')";
}
$db->exec($sql);
}
$i<4500是因为每次插入数据的条数是个等差数列,我算了一下,插4500次大概会插入10000000条数据;可惜的是,插入的速度仍然很慢,大概花了几分钟,具体数据我丢了,懒得再测试;
下面看下linux(ubuntu)平台下的插入速度:
因为单次单条很慢,且单次多条速度明显比单次单条快,所以直接不测试单次单条了,直接单次多条的insert,还是上面的代码,我测试了几次,大概插入10000000条数据耗时在110秒左右;所以结论就是linux平台插入数据快一点,在两个平台下,应该还有很多例如php,mysql版本等因素,但是实际结果应该不会有太大出入(后来才想起来,我电脑ubuntu在SSD里面,windows7在机械硬盘里,这里有出入)(update:环境为win10、ssd,插入10000000条数据耗时300秒左右,ssd对插入速度还是有很大的提升的,但是仍然没有ubuntu快);
关于”查”:
查询靠前的数据,速度都很快,越靠后越慢,例如分页的时候,查询第9900000行后面的10条数据,直接看ubuntu下的结果:
$data = $db->query("SELECT * FROM test LIMIT 9900000, 10")->fetchAll();
耗时约3s,我个人感觉已经很快了,但是搜索了一下,发现还有更快的方法,使用where语句,把LIMIT的第一个参数作为where的条件;
$data = $db->query("SELECT * FROM test WHERE id>9900000 LIMIT 10")->fetchAll();
结果是 0.001秒左右,速度显著变快,原因是;
limit 9900000,20的意思扫描满足条件的9900020行,扔掉前面的9900000行,返回最后的20行,问题就在这里,如果是limit 9900000,20,需要扫描9900020行,在一个高并发的应用里,每次查询需要扫描超过9900000行,性能肯定大打折扣。limit n性能是没问题的,因为只扫描n行。
所以,如果表中id自增,且id的值不间断,用where>这样的限制条件来做分页也是可以的,但是在实际项目中看起来有点不现实,毕竟实际中“变化”太多了。
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/11791.html

微信打赏
支付宝打赏
感谢您对作者homer的打赏,我们会更加努力! 如果您想成为作者,请点我
本文探讨了如何提高MySQL在Windows和Linux环境下插入大量数据的效率,通过批量插入的方式显著提升了插入速度。此外,对于分页查询,通过使用WHERE语句结合ID限制,实现了比LIMIT更快的查询性能。这种方法适用于ID自增且连续的场景,但在实际应用中可能受限于数据的动态变化。

被折叠的 条评论
为什么被折叠?



