mysql索引是否会在更新时修改?

时间:2012-04-10 00:29:21

标签: mysql database performance

假设我有一个mysql数据库表'article',其中包含以下字段:idtitleurlviews

我的字段title标有FULLTEXT索引,字段url标有UNIQUE索引。

我的问题是,如果我做一个普通的更新,比如:

UPDATE 'article' SET views = views + 1 WHERE id = {id} 

...这会导致更新mysql表索引吗?

是否安全(从速度的角度来看)将字段views保留在表格article中,或者我应该创建一个单独的表格,例如article_stats,其中包含以下内容字段:article_idviews

2 个答案:

答案 0 :(得分:0)

是的,UPDATE语句更新索引。 MySQL自动管理索引 - 您永远不必担心手动更新它们或触发更新。如果您询问特定的UPDATE是否会更改不包含views列的索引 - 否,则不会。只有相关的索引才会更新。

保留views列很好,除非您需要跟踪有关每个视图的额外信息(发生时间,制作视图的用户等)

但是,您的SQL确实包含语法错误。您不能引用'article'之类的表名。如果你需要引用一个表名(例如,如果它包含一个SQL保留字),那么使用这样的反引号:

UPDATE  `article` SET ...

答案 1 :(得分:0)

我同意Cal,如果更新索引,索引会更新更新语句“。在特定情况下,索引或索引不会更新,因为它们与视图字段无关,但更新视图仍然会变慢,因为这是一个如此频繁的操作,您可以通过编程方式将视图更新保存在具有二进制文件的共享内存中树或哈希表,并在一些时间或大小点后一起更新它们。为了获得最佳速度,您还可以使用存储器表,这些存储器表是易失性的,但您可以不时地将数据传输到实际的表。通过这种方式,您将无法处理每个“视图”更新的硬盘编写器。

保持单独的表格会产生同样的结果。您的应用程序速度变慢,因为存在选择时存在更新 - 您正在更新的行将被锁定,直到您完成它并且另一个读者将等待您的行级操作。即使在单独的表格中,您仍然可以选择显示该视图计数。

好吧,当你有那么多负载时,你可以让主服务器和从服务器分开读写,并不时地同步。