我在OpenCart中有一个product
表,共有57,000条记录。它看起来像:
Field Type Null Key Default Extra
product_id int(11) NO PRI NULL auto_increment
model char(64) NO NULL
sku char(100) NO UNI NULL
upc char(1) NO NULL
ean char(1) NO NULL
jan char(1) NO NULL
isbn char(1) NO NULL
mpn char(1) NO NULL
location char(1) NO NULL
quantity int(4) NO 0
stock_status_id int(11) NO NULL
image char(255) YES NULL
manufacturer_id int(11) NO MUL NULL
shipping tinyint(1) NO 1
pret_brut decimal(15,2) NO 0.00
price decimal(15,2) NO 0.00
points int(8) NO 0
tax_class_id int(11) NO NULL
date_available date NO NULL
weight decimal(15,8) NO 0.00000000
weight_class_id int(11) NO 0
length decimal(15,8) NO 0.00000000
width decimal(15,8) NO 0.00000000
height decimal(15,8) NO 0.00000000
length_class_id int(11) NO 0
subtract tinyint(1) NO 1
minimum int(11) NO 1
sort_order int(11) NO 0
status tinyint(1) NO MUL 0
date_added datetime NO 0000-00-00 00:00:00
date_modified datetime NO 0000-00-00 00:00:00
viewed int(5) NO 0
使用的索引:
PRIMARY BTREE Yes No product_id 56399 A No <br/>
sku BTREE Yes No sku 56399 A No<br/>
manufacturer_id BTREE No No manufacturer_id 386 A No<br/>
+status BTREE No No status 1 A No<br/>
+date_available 440 A No<br/>
...最后一个(带有“+”)是多个字段的索引(我不知道它的技术名称)。
问题是,当我在该表上运行类似“UPDATE product SET stock_status_id = 5,quantity = 0,status = 0”的查询时,我通过PHP的microtime()函数介于0.8到1.5秒之间。也许我有点偏执,但似乎太过分了。有没有办法改善更新时间?
LE
我想在该表中禁用所有产品,然后仅更新活动的产品。我不知道这是否是最好的方法,但我认为检查每一个更好。还有其他更快捷的方法吗?
答案 0 :(得分:2)
为什么不使用WHERE对记录进行分块,使用WHERE子句可以缩短更新时间
试试这个
UPDATE product SET stock_status_id=5, quantity=0, status=0
WHERE
status!=0;
答案 1 :(得分:1)
您的UPDATE
查询,正如您已制定的那样,会更新表格中的所有行。它以每两百微秒左右一行的速度进行。这是出色的表现。
通过这样做,你可能会更快一点:
UPDATE product SET stock_status_id=5, quantity=0, status=0
WHERE status <> 0
OR quantity <> 0
OR stock_status_id <> 5
这将避免更新已经重置的行。