2013-11-27 26 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