慢表更新

时间:2014-12-27 12:43:28

标签: php mysql

我在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

我想在该表中禁用所有产品,然后仅更新活动的产品。我不知道这是否是最好的方法,但我认为检查每一个更好。还有其他更快捷的方法吗?

2 个答案:

答案 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

这将避免更新已经重置的行。