我正在寻找 Web 应用程序的瓶颈,并发现 INSERT 查询的运行速度明显变慢,如下所示:
MariaDB [myforum]> insert into tag set tagtext='abc12345',dateline=unix_timestamp(),canonicaltagid=1234;
Query OK, 1 row affected (0.24 sec)
Run Code Online (Sandbox Code Playgroud)
这是通过将 安装mysql-client在应用程序容器中以进行测试来完成的。对于这样一个简单的查询,240 毫秒似乎很长。我假设了一些 dns/网络问题。但是在 MariaDB 容器中直接运行查询时,我看到了类似的结果,其中使用-h 127.0.0.1以下方法建立连接:
MariaDB [myforum]> insert into tag set tagtext='abc123',dateline=unix_timestamp(),canonicaltagid=1234;
Query OK, 1 row affected (0.251 sec)
Run Code Online (Sandbox Code Playgroud)
仅 INSERT 查询有效。SELECTs 和预期的一样快。奇怪的是,这似乎与 MariaDB Docker 安装有关:我在本地 XAMPP 安装上有相同的数据库,其中相同的查询速度很快:
MariaDB [myforum]> insert into tag set tagtext='abc123',dateline=unix_timestamp(),canonicaltagid=123;
Query OK, 1 row affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我只能对表格本身进行有限的更改,因为它们来自 vBulletin(旧的专有论坛 CMS)。
我想知道为什么这些简单的查询如此之慢?
这是我的错误:
警告:mysqli_stmt :: bind_param()[mysqli-stmt.bind-param]:变量数量与第19行/Applications/XAMPP/xamppfiles/htdocs/Jil/benutzer_eintragen.php中预准备语句中的参数数量不匹配
这是我的代码
$sql = "INSERT INTO benutzer SET vorname='?', nachname='?', username='?', email='?', passwort='?';";
$stmt = $db->prepare($sql);
$stmt->bind_param("sssss", $vorname, $nachname, $username, $email, $passwort);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud) 细节
我想利用mysql的空间扩展,所以我试图使用bindParam将经度和纬度存储在数据类型为POINT的mysql表中。不幸的是,我不断收到错误 SQLSTATE[23000]:完整性约束违规:1048 列“位置”不能为空。
我已经检查过经度和纬度有值。所以问题必须出在我的代码上,但我看不出我做错了什么。
这是我正在使用的代码。
$location=$latitude." ".$longitude;
$sql = "INSERT INTO my_geodata SET location = PointFromText('POINT(:location)')";
//INSERT INTO my_geodata SET location = PointFromText('POINT(-41 12)');
try
{
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':location', $location, PDO::PARAM_STR);
$stmt->execute();
$dbh = null;
}
catch(PDOException $e)
{
echo $error=$e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
题
我究竟做错了什么?如何使用 PDO 和 bindParam 将经度和纬度插入到 mysql 表(使用 POINT 数据类型)中?
变化
基于 AgreeOrNot 的回答,实现这一点的一种稍微不同的方法是
$location = 'POINT(' . $latitude . " " . $longitude . ')';
$sql = "INSERT INTO my_geodata (location) VALUES (PointFromText(:location))";
Run Code Online (Sandbox Code Playgroud) 我在Using The INSERT INTO ... SET Syntax In MySQL博客中读到,您可以使用以下SET语法来插入记录。
例子:
INSERT INTO mytable SET col1= 'val1', col6= 'val6', col10='val10';
INSERT INTO mytable SET col3= 'val3', col5= 'val5', col10='val10';
INSERT INTO mytable SET col4= 'val4', col5= 'val5', col6='val6';
Run Code Online (Sandbox Code Playgroud)
是否可以仅用 1 条语句插入多行?