1

構造が以下に示されている2つのテーブルがあります。これらのテーブルには多くのデータがありますが、テーブル構造を変更できません

表「ポストセール」

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 ;

およびテーブルの最終販売

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 ;

上記の2つの表に基づいて、このクエリの実行時間は非常に長いため、次のクエリを最適化する必要があります

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

3 に答える 3

0

テーブル定義で正しいデータ型を選択すると、パフォーマンスが大幅に向上します。

数値情報のみが含まれているように見える列がいくつかあり、いくつかの列に格納する方が適切intです。

auction_dateさらに、日付(データ型)に変換する必要があるようないくつかの日付の列があります。

varchar列の長さについても考えてください。ほとんどの場合、255文字は必要ありません。

データ型のMysqlDocuをよく見てください。

後でパフォーマンスの問題が発生した場合は、一部の列にインデックスを作成することを検討してください。ただし、テーブル定義を作り直し直後に、これについて考えることを強くお勧めします。

于 2012-04-25T13:03:37.223 に答える
0

スキーマを改善することが不可能であると仮定すると(OPコメントで言及されているように...肥大化しています)、それぞれにインデックスを追加することで、この特定のクエリのlot_noパフォーマンスが大幅に向上する可能性がありますgroup_idテーブルの。

InnoDBを使用しているので、外部キー制約(これはインデックスもカバーします)の使用を検討するかもしれませんが、それはテーブルのセマンティクスとライフサイクルに依存しますが、私にはわかりません。

于 2012-04-25T13:04:11.107 に答える
0

次のインデックスを追加します。

単一の列:

finalsale: (`group_id`)

複数列:

postsale: (`group_id, lot_no`)

これらのインデックスにより、MySQL は最初に WHERE 句の定数を finalsale テーブルに適用して結果セットを制限し、次にその最小限の結果セットを使用して postsale テーブルへの結合を実行し、インデックスを十分に活用できます。

于 2012-04-25T13:54:07.623 に答える