- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经尝试了所有我能从类似问题中找到的建议,但似乎都没有帮助。
我正在运行一个 PHP 脚本来将一些数据添加到数据库中——只有大约 1000 行。这是我正在使用的完整代码:
<?php
header('Content-Type: text/plain');
$t_start = microtime(true);
require('../php/connect.php');
$data = json_decode(file_get_contents('base/en/stringlist.js'));
foreach ($data as $cat => $values) {
$category = mysql_real_escape_string($cat);
foreach ($values as $key => $info) {
$name = mysql_real_escape_string($key);
$text = mysql_real_escape_string($info->text);
$tip = mysql_real_escape_string(isset($info->tip) ? $info->tip : '');
$query = "INSERT INTO locale_strings (name,text,tip,category) VALUES ('$name','$text','$tip','$category')";
if (!mysql_query($query)) {
echo mysql_error() . "\n";
}
}
}
echo 'Time: ' . round(microtime(true) - $t_start, 4) . ' seconds.';
?>
(我为 mysql_
语法道歉)。我已经在 3 台 PC 上使用过它,它们都运行 Win7/8,并安装了相当新的 XAMPP。在其中两台机器上,该脚本执行大约需要 2-3 秒,而在第三台机器上,它会在 30 秒后超时(添加约 900 行后)。什么会导致它运行速度慢 10 倍?
如果我注释掉 mysql_query
行,运行需要 0.012 秒,所以代码本身不是问题。数据库位于本地主机上,并包含在 etc/hosts
文件中 - 与其他机器上的相同。
这是表结构:
CREATE TABLE IF NOT EXISTS `locale_strings` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`category` varchar(255) NOT NULL,
`text` text NOT NULL,
`locked` int(11) NOT NULL DEFAULT '0',
`tip` text NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4833 DEFAULT CHARSET=utf8;
ALTER TABLE `locale_strings`
ADD PRIMARY KEY (`id`);
ALTER TABLE `locale_strings`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4833;
最佳答案
InnoDB 存储引擎是 ACID合规。每个查询都以自动提交模式运行,并且会使用磁盘的输入输出操作,这是相当昂贵的。这意味着每个查询都会强制硬盘驱动器 (HDD) 写入一条记录(而不是让操作系统安排它)。您的 HDD(如果是机械硬盘)每秒大约有 300 个 I/O。这意味着对于大约 900-1000 条记录,写下它们可能需要 2-3 秒。
相比之下,正如我提到的,使用 MyISAM 存储引擎可以让操作系统安排写入。记录不会立即写入磁盘;他们是buffered在保存到磁盘之前在内存中。虽然这意味着 MyISAM 更快,但代价是数据丢失的风险(如果系统崩溃或断电,而缓冲区中的数据尚未写入磁盘)。
要对此进行优化,通常的方法是将多个插入包装到一个事务中。一种方法是使用 PDO ,准备语句,启动事务并在完成 1000 次插入后提交。这使得硬盘驱动器可以在一次操作中写下大量数据。
您使用 PDO 重写的代码将像这样流动(注意 - 没有测试,不要复制粘贴,仅供引用):
// connect.php - note that the code around PDO should go in the file connect.php as per example
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try
{
$pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
}
//===================================================================
// The rest of the code
//===================================================================
// Decode JSON
$data = json_decode(file_get_contents('base/en/stringlist.js'));
// Check if there were any errors decoding JSON
if(empty($data))
{
echo "Something went wrong, error: " . json_last_error_msg();
exit;
}
try
{
// Prepare the statement - it's prepared once, used multiple times
$stmt = $pdo->prepare("INSERT INTO locale_strings (name, text, tip, category) VALUES (:name, :text, :tip, :category)");
// Start the transaction
$pdo->beginTransaction();
// Loop through the data, bind parameters, execute and when done - commit
foreach ($data as $cat => $values)
{
foreach ($values as $key => $info)
{
$stmt->bindValue(':name', $key, PDO::PARAM_STR);
$stmt->bindValue(':text', $info->text, PDO::PARAM_STR);
$stmt->bindValue(':tip', isset($info->tip) ? $info->tip : '', PDO::PARAM_STR);
$stmt->bindValue(':category', $cat, PDO::PARAM_STR);
$stmt->execute();
}
}
// And finally, tell the HDD to write down the info.
// Note - for this example, we issued all the contents in a single commit.
// That might not be the sweet spot so you can optimize later on with checking
// how many records are optimal go do down to the disk in a single I/O
$pdo->commit();
}
catch(PDOException $e)
{
if($pdo->inTransaction())
{
$pdo->rollBack();
}
// I assume you know how to handle exceptions, messages, trace etc.
}
关于PHP+MySQL 在一台机器上速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444280/
我被难住了。如果我对文件路径进行硬编码,则此脚本在我的 Windows 机器上的 Eclipse 中运行良好。如果我尝试接受参数并在我的边缘节点(一个 linux 机器)上运行它,它不会抛出任何特定的
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 8 年前。 这个问题似乎不是关于 a specific programming problem,
我们最近将我们的基础架构从 Solaris(Oracle/Sun Java) 迁移到 AIX(IBM Java)。 我们的客户将使用我们共享的算法(AES)和 key 上传加密文件,一旦加密文件放置在
我想编写一个程序(java),它接受一个文件作为输入,对其进行加密(使用aes128)并通过ftp发送该加密文件,接收者接收它并使用 key 进行解密。我是初学者,有什么帮助可以做到这一点吗?非常感谢
我正在尝试将一些为 1c2 机器 (thumb) 编译的 DLL 导入 WinMobile 6.1 C# 智能设备项目。 然而,当我尝试将它们导入我的 C# 项目时,我得到“无法添加对...的引用”,
我正在寻找 FPGA + 机器。 它应该是入门级定价(例如不超过 200 美元)。 编辑:我想制作一个 ASM 图表并将 FPGA 编程为我在图表中指定的行为 最佳答案 你看过Arduino ? 关于
这是我想完成的: Write a program that stimulates a bean machine Your program should prompt the user to enter
我尝试使用以下命令在 Windows 10 上使用 hyperv 创建一台机器: docker-machine create --driver hyperv default 但它给了我: This m
我有个问题 我的问题是我有一个将 mapred.map.tasks 配置为10的作业(抓取工具),这意味着我的工作将一次创建10个映射器。但是我的集群将 mapred.tasktracker.map.
我正在尝试使用命令重新启动 Docker sudo docker restart a7f8ce75f51f 但我收到以下错误 Error response from daemon: Cannot re
在新机器上引导 Eclipse 是一个非常耗时的过程,您最终会问自己是否真的需要每个插件。但这些都很方便,并且有助于养成一致的习惯。 Eclipse 引导问题包括: 解释/记录需要发生的事情 粘贴正确
我们希望建立一个 Docker 开发节点,我们团队中的任何人都可以将东西部署到其中。 我使用 SSH 创建了一个新的 Docker 机器,如下所示: docker-machine create \
如果可能的话,我想使用 java.util.logging 来做到这一点,有什么想法吗?谢谢。 最佳答案 您可以尝试一下SLF4J . Simple Logging Facade for Java (
当 vagrant up 时,我们的 vagrant box 需要大约 1 小时才能提供第一次运行,在配置过程的最后,我想将盒子打包到本地文件夹中的图像,以便下次需要重建时将其用作基础盒子。我正在使用
我正在为我的图像处理项目构建一个 SVM 线性机,在其中提取正样本和负样本的特征并将其保存到目录中。然后,我使用这些功能训练 SVM,但收到一个无法调试的错误。下面是我用于训练分类器的 train-c
问题描述: 我要将MySQL server 5.7.11 (win32) 安装到Windows server 2012 中。服务器中安装了多个网络接口(interface)卡,我将安装多个绑定(bin
我想安排一台 (AWS) Linux 计算机启动、运行程序,然后自行关闭(以将成本保持在最低水平)。我可以放 mycommand; shutdown 在/etc/rc.local 文件中。但如果我需要
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
如何将此文件的输出发送到另一台 Linux 计算机的主目录。 显然,我想发送此文件的输出: sed '/^\s*#/d;/^$/d' /etc/httpd/conf/httpd.conf 到 nati
我有一个 Linux 机器,我可以使用 SSH 进行 root 访问。 我想使用GDB来调试系统。 这是一个精简的 Debian 软件包;因此,我里面没有任何编译工具。 uname -a 给出: 2.
我是一名优秀的程序员,十分优秀!