【问题标题】:Does indexing make sense to speed up the use of UPDATE?索引对于加快 UPDATE 的使用是否有意义?
【发布时间】:2013-05-15 20:20:17
【问题描述】:

我在 MySQL 中有一个 MyISAM 表,其中包含三列 - 一个自动递增的 ID、一个整数(客户 ID)和一个小数(帐户余额)。

此时,每当我初始化系统时,我都会使用:

truncate table xyz;
alter table xyz auto_increment=1001;

然后我用来自 PHP 的数据重新填充表。我通常最终在该表中拥有多达 10,000 个条目。

但是,由于对系统的新要求,我现在还需要能够在系统运行时更新表,所以我不能再擦除表,必须使用 UPDATE 而不是 INSERT并一一更新余额,这比我现在一次插入 20 条新记录要慢得多。

PHP 仅将客户 ID 和金额发送到 MySQL - 另一个 ID 并未实际使用。

所以我的问题是: 考虑到来自 PHP 的输入很可能不按顺序排列,在客户 ID 上放置索引以加快更新是否有意义?还是添加索引会减慢它的速度以至于不值得?

我也不知道索引是否完全用于UPDATE 命令...

关于如何加快速度的任何其他建议?

【问题讨论】:

  • 将使用索引,因为您必须使用WHERE 语句来更新单行。每当您使用WHERE 进行搜索时,它都会使用索引。 MySQL 必须找到行,然后更新它。
  • @Pitchinnate 谢谢,这回答了我的部分问题 :-) 我是自学成才并经常使用 JOIN 并且知道索引在这里有很大帮助,但不知道WHERE,非常感谢!
  • 仅供参考,学习使用 MySQL 中的 explain 功能,它将在处理索引和优化 sql 查询时为您提供很多帮助。
  • 您还可以对余额相同的查询进行分组。在 php 中,您将遍历数据并存储余额相同的 id 数组,然后遍历该数组和 update table set balance=$balance where id in ({$balances[$balance]}) 或类似的。
  • 客户 ID 是否唯一?或者你有多个条目?如果它们是唯一的,只需将它们设为主键。您不需要自动递增的 id 列。

标签: php mysql indexing


【解决方案1】:

这取决于您的更新查询是什么。大概是这样的:

update xyz
    set val = <something>
    where id = <something else>

如果是这样,id 上的索引肯定会帮助加快速度,因为您正在寻找一条记录。

如果您的查询如下所示:

update xyz
    set val = 1.001 * val;

索引既无用也无害。需要扫描整个表,并且不涉及索引。

如果您的查询是这样的:

update xyz
    set id = id+1;

然后索引会变慢。您必须对表的每一行进行读取和写入,此外还要承担维护索引的开销。

【讨论】:

  • 感谢代码示例 - 它们帮助我更好地了解索引如何影响数据库。
【解决方案2】:

好的,我会把它变成一个答案。如果你说:

Update xyz set balance=100 where customer_id = 123;

那么是的,customer_id 上的索引肯定会提高速度,因为它会更快地找到要更新的行。

但是为了改进,如果您有列 (id,customer_id,balance) 并且 customer_id 是唯一的,并且 id 只是一个自动递增的列,请去掉 id 列并将 customer_id 设为主键。主键不必是自动递增的整数列。

【讨论】:

  • 还要感谢你——太糟糕了,我只能选择一个答案,因为你的答案也有非常有用的信息......
猜你喜欢
  • 2011-01-07
  • 2018-01-25
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2022-12-07
  • 1970-01-01
相关资源
最近更新 更多