gpt4 book ai didi

mysql - 更新mysql大表挂太时间

转载 作者:行者123 更新时间:2023-11-29 22:17:57 25 4
gpt4 key购买 nike

基于相同表上索引的更新MySql MyISAM大表使列升序的性能问题

我的问题是服务器只有4 GB内存。
我必须执行如下更新查询:previous asked question
我的是这样的:

set @orderid = 0;  
update images im
set im.orderid = (select @orderid := @orderid + 1)
ORDER BY im.hotel_id, im.idImageType;


im.hotel_id, im.idImageType上,我有一个升序的索引。
im.orderid上,我也有一个升序的索引。

该表有2100万条记录,是MyIsam表。

该表是这样的:

CREATE TABLE `images` (
`photo_id` int(11) NOT NULL,
`idImageType` int(11) NOT NULL,
`hotel_id` int(11) NOT NULL,
`room_id` int(11) DEFAULT NULL,
`url_original` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`url_max300` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`url_square60` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`archive` int(11) NOT NULL DEFAULT '0',
`orderid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`photo_id`),
KEY `idImageType` (`idImageType`),
KEY `hotel_id` (`hotel_id`),
KEY `hotel_id_idImageType` (`hotel_id`,`idImageType`),
KEY `archive` (`archive`),
KEY `room_id` (`room_id`),
KEY `orderid` (`orderid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


问题是性能:挂几分钟!
服务器磁盘也很忙。

我的问题是:有没有更好的方法来达到相同的结果?
我是否需要对表进行分区或其他操作以提高性能?
我无法修改服务器硬件,但可以调整MySql应用程序数据库服务器设置。

最好的祝福

最佳答案

您可以使用其中一些:


将引擎更新为InnoDB,它仅阻塞一行,而不阻塞更新时的所有表。
使用photo_id和良好的orderid创建#temp表,然后从此temp更新表:

update images im, temp tp
set im.orderid = tp.orderid
where im.photo_id = tp.photo_id



这将是最快的方法,当您填充tmp表时-主表上没有任何块。


您可以在批量更新之前删除索引。在完成所有一次更新后,您将重建索引,而且时间很长。

关于mysql - 更新mysql大表挂太时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com