2012-04-25 145 views
1

我有兩個表的結構給出波紋管,這些表有大量的數據,但不能改變表stucture如何優化這個MYSQL查詢?

表「postsale」

CREATE TABLE IF NOT EXISTS `postsale` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `group_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `season` varchar(25) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `sale_no` int(5) NOT NULL, 
    `auction_date` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `season_time` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `lot_no` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `invoice_no` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `origin` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `tea_type` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `sub_tea_type` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `category` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `mark` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `grade` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `no_of_packages` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `gross_wt` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `net_wt` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `auction_valuation` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `lsp_sp` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `package_type` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `package_no` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `quantity` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `auctioneer` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `auction_price` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `buyer` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `area` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `broker_code` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `csv` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `session` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=29623 ; 

和表finalesale

CREATE TABLE IF NOT EXISTS `finalsale` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `group_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `season` varchar(25) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `sale_no` int(5) NOT NULL, 
    `auction_date` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `season_time` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `lot_no` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `invoice_no` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `origin` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `tea_type` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `sub_tea_type` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `category` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `mark` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `grade` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `no_of_packages` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `gross_wt` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `net_wt` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `auction_valuation` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `lsp_sp` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `package_type` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `package_no` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `quantity` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `auctioneer` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `auction_price` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `buyer` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `area` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `broker_code` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `csv` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `session` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=41365 ; 

根據以上兩張表格,這個查詢的執行時間很大,所以我需要優化下面的查詢

UPDATE `finalsale`,`postsale` 
SET 
    `finalsale`.`auction_price`=`postsale`.`auction_price`, 
    `finalsale`.`csv`=`postsale`.`csv`, 
    `finalsale`.`session`=`postsale`.`session` 
WHERE `finalsale`.`lot_no`=`postsale`.`lot_no` 
     AND `finalsale`.`group_id`=`postsale`.`group_id` 
     AND `finalsale`.`group_id`='201217CLGuwahatiJT' 

請幫忙

+4

omg,立即重做該模式,檢查MySQL文檔 – virtualeyes 2012-04-25 12:56:26

+0

您將無法優化查詢。如果速度很慢,您需要考慮索引一些列。例如'lot_no' cols是'VARCHAR()'。他們可能受益於兩個表格上的索引。 'group_id'也是'VARCHAR()',可能應該編入索引。 – 2012-04-25 12:56:30

+0

@Michael,看看架構,你不能做得更糟糕,可能選擇文本()存儲類型的缺點;-) – virtualeyes 2012-04-25 12:57:35

回答

0

從表格定義中選擇正確的數據類型,您將獲得嚴重的性能提升。

有幾列看起來只包含數字信息,最好存儲在一些int列中。

此外,還有一些日期欄,如auction_date應該轉換爲日期 - 數據類型。

也想想你的varchar列的長度。大多數時候你不需要那裏的255個字符。

仔細查看Mysql Docu for datatypes

如果之後出現性能問題,您可能會考慮在某些列上創建索引。但我強烈建議你考慮一下AFTER你重寫了你的表定義!

0

假設您不可能改進架構(正如在OP評論中提到的那樣,這是相當......臃腫的),您可能會得到顯着的性能提升對於此特定查詢每個表上的lot_nogroup_id上的索引。

由於您使用InnoDB,您可能會考慮使用外鍵約束(這也包括索引),儘管它取決於表的生命週期&,我不知道。

0

添加以下指標:

單柱:

finalsale: (`group_id`) 

多列:

postsale: (`group_id, lot_no`) 

這些索引允許MySQL來首先限制的結果通過在應用中不斷設置FINALSALE表的WHERE子句,然後用最小的結果集執行到postsale表的連接,充分利用索引。