我在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
命令的索引......
关于如何提高速度的任何其他建议?
答案 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成为主键。主键不必是自动递增的整数列。