我正在开发一个PHP脚本,我只是想知道我是否可以使这个代码片具有更好的性能。
我必须制作2个mysql查询才能完成我的任务。有没有其他方法可以通过更好的性能来完成这个?
$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
答案 0 :(得分:3)
您可以通过将stamtement对象存储到变量来提高性能,这样可以减少一个查询:
$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
或第二个选项,您可以向language
和shortName
添加唯一约束。
如果你插入一个副本,它会抛出一个错误,如果没有它会插入,这样你只保留一个查询INSERT一个,但你可能需要一个try catch for duplicates。
答案 1 :(得分:0)
为什么不做这样的事情:
$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 cut SQL通常效率不高。