如果不存在,则插入,并在PHP&;中获取插入Id;MySql
我正在开发一个PHP脚本,我只是想知道我是否可以使这个代码具有更好的性能 我必须进行2次mysql查询才能完成我的任务。是否有其他方法可以以更好的性能完成此任务如果不存在,则插入,并在PHP&;中获取插入Id;MySql,php,mysql,mysqli,Php,Mysql,Mysqli,我正在开发一个PHP脚本,我只是想知道我是否可以使这个代码具有更好的性能 我必须进行2次mysql查询才能完成我的任务。是否有其他方法可以以更好的性能完成此任务 $language = "en"; $checkLanguage = $db->query("select id from language where shortName='$language'")->num_rows; if($checkLanguage>0){ $languageSql
$language = "en";
$checkLanguage = $db->query("select id from language where shortName='$language'")->num_rows;
if($checkLanguage>0){
$languageSql = $db->query("select id from language where shortName='$language'")->fetch_assoc();
$languageId = $languageSql['id'];
}else{
$languageSql = $db->query("insert into language(shortName) values('$language')");
$languageId = $db->insert_id;
}
echo $languageId
您可以通过将StamItem对象存储到变量来提高性能,这样可以减少查询次数:
$checkLanguage = $db->query("select id from language where shortName='$language'");
if($checkLanguage->num_rows >0){
$languageSql = $checkLanguage->fetch_assoc();
$languageId = $languageSql['id'];
}else{
$languageSql = $db->query("insert into language(shortName) values('$language')");
$languageId = $db->insert_id;
}
echo $languageId
或者,第二个选项是向语言
和短名称
添加唯一约束
如果插入重复项,它将抛出一个错误,如果不插入,它将插入,这样您只保留一个查询,而插入一个查询,但您可能需要尝试捕获重复项。您可以通过将StamItem对象存储到变量来提高性能,这样可以减少一个查询:
$checkLanguage = $db->query("select id from language where shortName='$language'");
if($checkLanguage->num_rows >0){
$languageSql = $checkLanguage->fetch_assoc();
$languageId = $languageSql['id'];
}else{
$languageSql = $db->query("insert into language(shortName) values('$language')");
$languageId = $db->insert_id;
}
echo $languageId
或者,第二个选项是向语言
和短名称
添加唯一约束
如果插入一个重复项,它将抛出一个错误,如果不插入,它将插入,这样您只保留一个查询,而插入一个查询,但是您可能需要一个重复项的try catch。为什么不这样做:
$language = "en";
$dbh = $db->query("INSERT IGNORE INTO `language` (`shortName`) VALUES ('{$language}');");
$id = $db->insert_id;
echo (($id !== 0) ? $id : FALSE);
这将在单个查询中执行您的逻辑,并返回id,或者在重复查询中返回false。在SQL中解决数据库性能问题通常比在PHP中更好,因为大约65%的开销是在与数据库的实际连接中,而不是在查询本身中。减少运行的查询数量通常比改进围绕查询运行的脚本逻辑对性能的影响要大得多。一贯依赖ORM的人在这方面经常会遇到很多麻烦,因为cookie-cutter SQL通常性能不是很好。为什么不这样做呢:
$language = "en";
$dbh = $db->query("INSERT IGNORE INTO `language` (`shortName`) VALUES ('{$language}');");
$id = $db->insert_id;
echo (($id !== 0) ? $id : FALSE);
这将在单个查询中执行您的逻辑,并返回id,或者在重复查询中返回false。在SQL中解决数据库性能问题通常比在PHP中更好,因为大约65%的开销是在与数据库的实际连接中,而不是在查询本身中。减少运行的查询数量通常比改进围绕查询运行的脚本逻辑对性能的影响要大得多。一贯依赖ORM的人在这方面经常会遇到很多麻烦,因为cookie-cutter SQL通常性能不是很好。为什么要检查行数?只需获取结果并检查返回的数组,看看它是否包含任何内容。@develinnate因为获取比检查数组的数量更昂贵rows@meda-谢谢解释。由于查询缓冲,结果仍在提取中。为什么要检查行数?只需获取结果并检查返回的数组,看看它是否包含任何内容。@develinnate因为获取比检查数组的数量更昂贵rows@meda-谢谢解释。由于查询缓冲,结果仍在提取中。