索引是否有助于加快UPDATE的使用?

时间:2013-05-15 20:20:17

标签: php mysql indexing

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

此时,每当我初始化系统时,我都会使用以下内容完全擦除表格。

truncate table xyz;
alter table xyz auto_increment=1001;

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

但是,由于对系统的新要求,我现在还需要能够在系统运行时更新表,因此我无法再擦除表并且必须使用UPDATE而不是{ {1}}并逐个更新余额,这比我现在一次插入20条新记录慢得多。

PHP仅将客户ID和金额发送给MySQL - 其他ID实际上并未使用。

所以我的问题是: 考虑到PHP的输入很可能不是有序的,为客户ID添加索引以加快更新是否有意义?或者将添加索引减慢到足以让它变得不值得?

我也不知道是否完全使用了INSERT命令的索引......

关于如何提高速度的任何其他建议?

2 个答案:

答案 0 :(得分:3)

这取决于您的更新查询。大概就像是:

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

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

如果您的查询如下:

update xyz
    set val = 1.001 * val;

索引既不会有帮助,也不会伤害。需要扫描整个表格并且不涉及索引。

如果您的查询如下:

update xyz
    set id = id+1;

然后索引会变慢。你必须读取和写入表的每一行,然后你就有了维护索引的开销。

答案 1 :(得分:3)

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

Update xyz set balance=100 where customer_id = 123;

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

但是为了改进,如果你有列(id,customer_id,balance)和customer_id是唯一的,id只是一个自动递增的列,除去id列并使customer_id成为主键。主键不必是自动递增的整数列。