2

假设我有一个 mysql 数据库表“文章”,其中包含以下字段:id, title, url,views

我有用索引title标记的字段和用索引标记FULLTEXT的字段。urlUNIQUE

我的问题是,如果我进行普通更新,例如:

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

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

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

4

2 回答 2

0

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

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

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

UPDATE  `article` SET ...
于 2012-04-10T00:31:49.260 回答
0

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

保持单独的表会导致同样的事情。您的应用程序会变慢,因为当有选择时会有更新 - 您正在更新的行将被锁定,直到您完成它并且其他读者将等待您的行级操作。即使在单独的表格中,您仍然可以选择显示该视图计数。

好吧,当你有这么多负载时,你可以拥有主服务器和从服务器来分离读写并不时同步。

于 2012-04-10T00:40:05.427 回答