2012-04-25 78 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表的连接,充分利用索引。