2013-11-27 22 views
0

在我的数据库中我有名为fo_image_guestimage的表,它仅包含多于2,63,000行。但是,当我试图更新只有一个的内容,它yakes太多的时间(121.683ms)如何最小化在mysql中的查询时间

我的表结构 - 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大小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 

我的客户增加了1000行fo_guest_image。现在fo_guest_image表格大小为2.8 GB,肯定会逐日增加。如果桌子有一天达到10 G.B,我很可怕。那么演出会发生什么。

+1

在'fo_image_GuestHistoryId'上创建索引? – hjpotter92

+0

非BLOB列的更新需要多长时间?表中总共有多少行,而'fo_image_GuestHistoryId = 0'?这张桌子上是否有任何索引或限制? – Stoleg

+0

@stoleg这是一个非BLOB列!我的桌子上没有索引。 fo_image_id是主键,全部都是 – Sagotharan

回答

-1

简短的解决方案:在列“Fo_Image_Regno”

较长,但更好的补充指标,解决方法:不存储图像的表格中。只存储表格中图像的链接。然后将图像存储在系统的本地文件夹/目录中。现在和将来都会好得多

+0

实际上,我将链接存储在数据库中,并在我知道MySQL中的Blob方法之前将文件保存在文件夹中。过去一年前,我将其更改为BLOB。 MySQL中的Blob是最差的?是否有任何其他解决方案。或者我想退后一步? – Sagotharan

+1

你以前做过的是最好的。因此,您可以返回并将链接存储在本地文件夹中的数据库和图像文件中。在将来更新和制作备份和管理数据时,数据库将会更快。 – Andrew

-1

我对第一次不正确的道歉表示歉意。我没有意识到你正在更新非blob列。然而,我对使用BLOB列存储文档的所有保留都是有效的。

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

检查SELECT查询将运行多长时间。我相信这将与更新声明的时间非常接近。 2.9百万行不是一个小数据集。

fo_image_GuestHistoryID上添加索引将加快此查询,但会将inserts稍微放慢到表中。创建索引也需要一些时间。

指数会加速它,但有索引的成本。如果增加1000 ros,一天的利益应该超出其成本。

+0

Blob是否有其他选择?以及如何找到MySQL的行? – Sagotharan

+0

EXPLAIN update命令在MySQL 5.1.36中不起作用。那里有其他选择吗? – Sagotharan

+0

您是否考虑过在数据库和文件系统中存储路径? – Stoleg