MySQL INSERT shorthand 对比手写表现
MySQL INSERT shorthand vs longhand performance
有什么区别:
INSERT INTO `table_name` SET `col1` = 'val1', `col2` = 'val2', `col3` = 'val3'
和
INSERT INTO `table_name` (`col1`,`col2`,`col3`) VALUES('val1','val2','val3')
使用 shorthand 有性能优势吗?我自己更喜欢手写,但从逻辑上讲,出于性能原因,我应该每次都使用 shorthand 吗?基准测试告诉我上面的选项 #2 快了大约 3%,但为什么呢?
public function benchmarkInsert() {
$int_value = 1;
$varchar_value = 'Stuff';
$serialized_value = json_encode(array('Serialized Stuff'));
$this->db->query("TRUNCATE TABLE `query_benchmark`");
$start = microtime(true);
for ( $i = 0; $i < 10000; $i++ ) {
$this->db->query("INSERT INTO `query_benchmark` (`col1`,`col2`,`col3`) VALUES($int_value,'$varchar_value','$serialized_value')");
}
$elapsed = microtime(true) - $start;
echo 'SHORTHAND: '.$elapsed.'<br/>';
$this->db->query("TRUNCATE TABLE `query_benchmark`");
$start = microtime(true);
for ( $i = 0; $i < 10000; $i++ ) {
$this->db->query("INSERT INTO `query_benchmark` SET `col1` = $int_value, `col2` = '$varchar_value', `col3` = '$serialized_value'");
}
$elapsed = microtime(true) - $start;
echo 'LONGHAND: '.$elapsed.'<br/>';
}
这两个查询应该没有区别。他们应该被数据库转化为相同的执行计划。
3% 的差异可能是由无关因素(缓存、数据库负载等)造成的
您可以通过使用 EXPLAIN
查看执行计划来验证这一点
相差 2。#1 比 #2 长 2 个字符。
我在记事本中测试过。
随着时间的推移,我们正在谈论腕管综合症
也让你的左手小指休息一下`
有什么区别:
INSERT INTO `table_name` SET `col1` = 'val1', `col2` = 'val2', `col3` = 'val3'
和
INSERT INTO `table_name` (`col1`,`col2`,`col3`) VALUES('val1','val2','val3')
使用 shorthand 有性能优势吗?我自己更喜欢手写,但从逻辑上讲,出于性能原因,我应该每次都使用 shorthand 吗?基准测试告诉我上面的选项 #2 快了大约 3%,但为什么呢?
public function benchmarkInsert() {
$int_value = 1;
$varchar_value = 'Stuff';
$serialized_value = json_encode(array('Serialized Stuff'));
$this->db->query("TRUNCATE TABLE `query_benchmark`");
$start = microtime(true);
for ( $i = 0; $i < 10000; $i++ ) {
$this->db->query("INSERT INTO `query_benchmark` (`col1`,`col2`,`col3`) VALUES($int_value,'$varchar_value','$serialized_value')");
}
$elapsed = microtime(true) - $start;
echo 'SHORTHAND: '.$elapsed.'<br/>';
$this->db->query("TRUNCATE TABLE `query_benchmark`");
$start = microtime(true);
for ( $i = 0; $i < 10000; $i++ ) {
$this->db->query("INSERT INTO `query_benchmark` SET `col1` = $int_value, `col2` = '$varchar_value', `col3` = '$serialized_value'");
}
$elapsed = microtime(true) - $start;
echo 'LONGHAND: '.$elapsed.'<br/>';
}
这两个查询应该没有区别。他们应该被数据库转化为相同的执行计划。
3% 的差异可能是由无关因素(缓存、数据库负载等)造成的
您可以通过使用 EXPLAIN
相差 2。#1 比 #2 长 2 个字符。
我在记事本中测试过。
随着时间的推移,我们正在谈论腕管综合症
也让你的左手小指休息一下`