【发布时间】:2015-10-09 15:55:07
【问题描述】:
这是我的桌子:
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| CLID | int(11) | NO | MUL | NULL | |
| calldate | datetime | YES | MUL | NULL | |
| src | varchar(20) | YES | | NULL | |
| dst | varchar(20) | YES | | NULL | |
| billsec | varchar(10) | YES | | NULL | |
| duration | time | YES | | NULL | |
| debt | float | YES | MUL | NULL | |
| region | varchar(255) | YES | | NULL | |
| uniqueid | varchar(20) | NO | PRI | NULL | |
+----------+--------------+------+-----+---------+-------+
它有超过 490,328 条记录。我必须更新此表中的每条记录。这是查询(我在 PHP 中使用 mysqli):
UPDATE `All`
SET `debt` = '$debt', `region` = '$region'
WHERE `uniqueid` = $uid;
不幸的是,执行单个查询需要大约 1.4519529342651 秒。有什么办法可以加快速度吗?
【问题讨论】:
-
你有
uniqueid的索引吗? -
@JuanCarlosOropeza 它是一个主键,它是一种索引类型,对吧?
-
您可以通过 uniqueid 范围对表进行分区,因此查询不必查看扫描所有行。此外,您可以尝试一次性更新所有这些记录,其中 dbt 和 region 更改为相同的值,而不是单独更新每条记录。
-
抱歉错过了。如果您必须更新每条记录,如果您再次创建表
CREATE TABLE 'All' AS Select * FROM WhereYouHaveTheData可能很容易。 -
其他选项在更新过程中禁用
debt或region上的任何索引。因为每次更新后索引都会重建。然后在最后再次启用。
标签: mysql sql optimization query-optimization