[英]MYSQL Query Takes 4 Hours
大家下午好。 我是来找您的,希望您可以为我遇到的MYSQL优化问题提供一些指导。 首先,一些系统规格。
电脑:
我有两个表:
“ Delta_Shares”包含股票交易数据,并包含两列注释。 “ Ticker”是Varchar(45),“ Date_Filed”是Date。 该表大约有300万行(全部都是唯一的)。 我在(Ticker,Date_Filed)上的“ DeltaSharesTickerDateFiled”表上有一个索引。
“ Stock_Data”包含两列注释。 “股票代号”是Varchar(45),“ Value_Date”是日期。 该表大约有1900万行(所有行都是唯一的)。 我在(Ticker,Value_Date)上的“ StockDataIndex”表上有一个索引。
我试图通过从Stock_Data表中查找信息来更新“ Delta_Shares”表。 以下查询需要4个小时以上才能运行。
update delta_shares A, stock_data B
set A.price_at_file = B.stock_close
where A.ticker = B.ticker
and A.date_filed = B.value_Date;
过多的运行时间是否是大量行,不良索引,不良机器,不良SQL编写或以上所有结果的自然结果? 请让我知道是否还有其他有用的信息(尽管我对MYSQL不太熟悉,尽管这个问题使我大大地偏离了优化的道路)。 我非常感谢任何想法或建议。
用“ EXPLAIN SELECT”更新
1(id) SIMPLE(seltype) A(table) ALL(type) DeltaSharesTickerDateFiled(possible_keys) ... 3038011(rows)
1(id) SIMPLE(seltype) B(table) ref(type) StockDataIndex(possible_keys) StockDataIndex(key) 52(key_len) 13ffeb2013.A.ticker,13ffeb2013.A.date_filed(ref) 1(rows) Using where
用表描述更新。 库存数据表:
idstock_data int(11) NO PRI auto_increment
ticker varchar(45) YES MUL
value_date date YES
stock_close decimal(10,2) YES
Delta_Shares表:
iddelta_shares int(11) NO PRI auto_increment
cik int(11) YES MUL
ticker varchar(45) YES MUL
date_filed_identify int(11) YES
Price_At_File decimal(10,2) YES
delta_shares int(11) YES
date_filed date YES
marketcomparable varchar(45) YES
market_comparable_price decimal(10,2) YES
industrycomparable varchar(45) YES
industry_comparable_price decimal(10,2) YES
来自Delta_Shares的索引:
delta_shares 0 PRIMARY 1 iddelta_shares A 3095057 BTREE
delta_shares 1 DeltaIndex 1 cik A 18 YES BTREE
delta_shares 1 DeltaIndex 2 date_filed_identify A 20633 YES BTREE
delta_shares 1 DeltaSharesAllIndex 1 cik A 18 YES BTREE
delta_shares 1 DeltaSharesAllIndex 2 ticker A 619011 YES BTREE
delta_shares 1 DeltaSharesAllIndex 3 date_filed_identify A 3095057 YES BTREE
delta_shares 1 DeltaSharesTickerDateFiled 1 ticker A 11813 YES BTREE
delta_shares 1 DeltaSharesTickerDateFiled 2 date_filed A 3095057 YES BTREE
来自Stock_Data的索引:
stock_data 0 PRIMARY 1 idstock_data A 18683114 BTREE
stock_data 1 StockDataIndex 1 ticker A 14676 YES BTREE
stock_data 1 StockDataIndex 2 value_date A 18683114 YES BTREE
您可以通过一些基准测试来了解瓶颈所在。 例如,尝试将字段更新为恒定值,并查看需要花费多长时间(显然,您需要创建数据库的副本才能执行此操作)。 然后尝试一个不更新的选择查询,而只是选择要更新的值以及它们将被更新为的值。
这样的基准通常会告诉您是在浪费时间进行优化还是有很大的改进空间。
至于记忆,这是您正在查看的大致概念:
varchar字段是2个字节,加上实际长度,而datetime字段是8个字节。 因此,让我们做出一个非常宽松的猜测,即Stock_Data表中的varchar字段平均约为42个字节。 使用datetime字段,每行最多增加50个字节。
50字节x 2000万行= 0.93千兆字节
因此,如果此过程是计算机中唯一发生的事情,那么我认为内存不是问题,因为您可以轻松地一次将查询所使用的两个表中的所有数据放入内存中。 但是,如果发生其他情况,则可能是一个因素。
尝试对两个表analyse
,并使用straight join
而不是隐式联接。 只是一个猜测,但这听起来像是一个困惑的优化器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.