如何最小化mysql中的查询时间

时间:2013-11-27 10:52:53

标签: mysql

在我的数据库中,我有一个名为fo_image_guestimage的表,它只包含2,63,000行。但是,当我尝试仅更新其中的一个内容时,它会花费太多时间(121.683ms)

我的表结构 - enter image description here

我的查询执行及其时间

my query execution and its time

如何最小化mysql中的查询时间?我的表类型是InnoDB。

编辑1 -

我的数据库大小 - 3.5 GB,fo_guest_image表大小2.8 GB

表格结构

CREATE TABLE `fo_guest_image` (
    `Fo_Image_Id` INT(10) NOT NULL AUTO_INCREMENT,
    `Fo_Image_Regno` VARCHAR(10) NULL,
    `Fo_Image_GuestHistoryId` INT(10) NOT NULL,
    `Fo_Image_Photo` LONGBLOB NOT NULL,
    `Fo_Image_Doc1` LONGBLOB NOT NULL,
    `Fo_Image_Doc2` LONGBLOB NOT NULL,
    `Fo_Image_Doc3` LONGBLOB NOT NULL,
    `Fo_Image_Doc4` LONGBLOB NOT NULL,
    `Fo_Image_Doc5` LONGBLOB NOT NULL,
    `Fo_Image_Doc6` LONGBLOB NOT NULL,
    `Fo_Image_Billno` VARCHAR(10) NULL,
    PRIMARY KEY (`Fo_Image_Id`)
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=36857

以执行时查询

select COUNT(Fo_Image_Regno) from fo_guest_image; Time: 11.483ms

select * from fo_guest_image where Fo_Image_Regno='G13603'; Time: 101.381ms

update fo_guest_image set Fo_Image_Regno='T13603' where Fo_Image_Regno='G13603'; Time: 144.360ms

我试过一个nonblob表: - fo_daybook Size 400 KB

以执行时查询

select * from fo_daybook; Time: 0.144ms

select fo_daybok_Regno from fo_daybook; Time: 0.004ms

update fo_daybook set fo_daybok_Regno ='T13603' where fo_daybok_Regno ='G13603'; Time: 0.011ms

我的客户在fo_guest_image中每天添加1000行。现在fo_guest_image表大小为2.8 GB,肯定会逐日增加。如果桌子有一天达到10 G.B,我很可怕。然后会有什么表现。

2 个答案:

答案 0 :(得分:-1)

对于不正确的首次解雇,我深表歉意。我没有意识到你正在更新非blob列。但是,我对使用BLOB列存储文档的所有保留都是有效的。

UPDATE语句更新了14119行。它必须读取所有290万行,找到匹配WHERE子句的14k,然后才更新它们。

检查SELECT查询的运行时长。我相信它会非常接近更新声明的时间。 2.9亿行不是一个小数据集。

fo_image_GuestHistoryID上添加索引会加快此查询速度,但会略微降低inserts到表中的速度。此外,创建索引还需要一些时间。

索引会加快速度,但是有索引的成本。如果每天增加1000 ros,那么indes的好处应该超过其成本。

答案 1 :(得分:-1)

简短解决方案:在“Fo_Image_Regno”列上添加索引

更长但更好的解决方案:不要将图像存储在表格中。仅存储指向表格中图像的链接。然后将图像存储在系统上的本地文件夹/目录中。现在和将来会好得多

相关问题