【发布时间】: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 列。