2013-05-15 27 views
0

我有一个MyISAM MySQL表中有三列 - 一个自动递增的ID,一个整数(客户ID)和一个小数(账户余额)。索引是否有意义加快UPDATE的使用?

在这个时候,每当我初始化我的系统,我彻底清除使用表:

truncate table xyz; 
alter table xyz auto_increment=1001; 

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

但是,由于系统的新要求,我现在还需要在系统运行时更新表,因此我无法再擦除表并必须使用UPDATE而不是INSERT,并更新了平衡一个接一个,比我现在要做的每次插入20个新记录要慢得多。

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

所以我的问题是这样的: 为了加快更新,将索引放在客户ID上是否有意义,因为来自PHP的输入最有可能不会按顺序排列?或者是否会添加指数使其降低到足以使其不值得?

我也不知道,如果指数在所有用于UPDATE命令或不...

就如何加快这没有其他的建议?

+3

指数将使用,因为你将不得不使用'WHERE'语句更新一行。任何时候你用'WHERE'进行搜索都会使用索引。 MySQL必须找到该行,然后进行更新。 – Pitchinnate

+0

@Pitchinnate谢谢,这回答了我的问题的部分:-)我是自学成才的,并且使用'JOIN'很多,并且知道索引在这里有很多帮助,但不知道'WHERE',所以谢谢! – semmelbroesel

+2

只是简单的学习使用MySQL中的'explain'功能,在处理索引和优化你的sql查询时,它会帮助你很多。 – Pitchinnate

回答

3

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

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

如果是这样,在id指数一定会帮助加快速度,因为你正在寻找一个记录。

如果您的查询是这样的:

update xyz 
    set val = 1.001 * val; 

的指数既不会帮助,也没有受伤。整个表格将需要扫描,索引不会涉及。

如果您的查询是这样的:

update xyz 
    set id = id+1; 

然后指数会比较慢。你必须读取和写入表的每一行,再加上你维护索引的开销。

+0

感谢代码示例 - 它们帮助我更好地理解索引如何影响数据库。 – semmelbroesel

3

好的,我会做出这个答案。如果你说:

Update xyz set balance=100 where customer_id = 123; 

然后是的customer_id索引肯定会增加速度,因为它会发现更快的行更新。

但改进的地方,如果你有列(ID,CUSTOMER_ID,平衡)和CUSTOMER_ID是独一无二的,ID仅仅是一个自动递增列摆脱ID列,使CUSTOMER_ID的主键。主键不必是自动递增的整数列。

+0

同样感谢你 - 这很糟糕,我只能选择一个答案,因为你也有非常有用的信息... – semmelbroesel

相关问题