mysql更新〜比select慢25倍。是正常的吗?

时间:2015-03-01 13:09:00

标签: mysql

更新代码

$stmt_update = $db->prepare( ' 
UPDATE table SET Column = 1 
WHERE Id = 17
' ); 
$stmt_update->execute( );

需要~25毫秒

但是

$stmt_select = $db->prepare( ' 
SELECT 
`Text`, 
`NameOfPerson`, 
`EmailOne`, 
`Phone`, 
`EmailTwo` 
FROM table_name
WHERE Id = ?
' ); 
$stmt_select->execute( array( trim( $_GET["two"] ) ) );

这需要~1毫秒。

这是正常的(这种差异)?任何想法如何更快地更新(执行得更快)?

1 个答案:

答案 0 :(得分:2)

这是有道理的。但是,您需要了解有关衡量绩效的一些事项。第一个查询可能是将数据读入内存。这需要一点时间。当您运行第二个查询时,它已经存在。通常,第二次运行完全相同的查询比第一次更快 - 除非您在服务器上使用缓存选项。

update会变慢,因为数据库具有所谓的ACID属性。这意味着直到数据库确定更新才会完成,因为更改已经完成。通常,这意味着将日志事务提交到磁盘,因此您正在等待磁盘写入完成。磁盘写入启动还不够 - 必须完成。这也意味着update已获取正在更新的表部分的锁。

此外,数据库最终必须将实际修改的数据页写入磁盘。在MySQL中,这可能取决于存储引擎。所以,你可能在等待它。

select不会修改任何内容。它只是读。所以有一段时间来获取数据,但只要它在内存中,查询就可以处理并完成。

此外,update可能会为数据库引擎生成其他工作 - 例如更新索引和运行触发器。目前还不清楚这些是否在您的桌子上定义。

所以,我希望update花费的时间超过select