使用具有两个条件的内部联接更新表并复制两列

时间:2014-12-18 15:34:45

标签: mysql inner-join updates

我有一张包含150万条记录的表prices,我有一张包含1500条记录的表flaggedcomments

flaggedcomments包含以下列:

  • Flaggedcomments_ID
  • Comments_DateTime
  • 作者
  • 评论
  • Tickers_Ticker_ID
  • Price_DateTime(空)
  • Price_Open(空)

prices具有以下列(它们都填充了值):

  • Prices_ID
  • Prices_DateTime
  • Prices_Open
  • Tickers_Ticker_ID

这是我的MySQL语法:

UPDATE flaggedcomments t1 
INNER JOIN prices t2 
ON t1.Tickers_Ticker_ID = t2.Tickers_Ticker_ID AND t1.Comments_Date = t2.Prices_DateTime
SET t1.Prices_DateTime = t2.Prices_DateTime, t1.Prices_Open = t2.Prices_Open

我想确保Comments_DateTime表中的flaggedcommentsPrices_DateTime表中的prices匹配;与Tickers_Ticker_IDflaggedcomments中的prices匹配,然后将Prices_DateTimePrices_Openprices表填入flaggedcomments }。

语法已于2小时前执行,并且仍在运行(在MySQL工作台中执行此操作)。我还尝试从我的程序的datagridview中查找flaggedcomments,这两列似乎仍然是完全空的。

我一直在纠正我的语法,目前看起来是正确的,但我不知道它是否有任何问题?有人可以建议或指出问题吗?或者仅仅是因为大桌子?

非常感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

由于prices表有如此大的记录,所以时间有点长(耗时约3.5小时)。正确的语法应该使用LEFT JOIN而不是INNER JOIN

答案 1 :(得分:0)

有不同程度的指数化。我相信您已经将列Prices_ID声明为主键,因此该列已经具有聚簇索引。每个表只能有一个聚簇索引,它会影响逻辑如何在物理存储中保存信息并加快查询速度(按Prices_ID搜索行)。因此,让我们考虑如何使用二级索引来加速查询。

对于表flaggedcomments中的每一行,您的查询(DBMS)会尝试从表prices中查找与某些条件匹配的行。因此,如果在条件中使用的prices表的列上添加索引,DBMS将能够快速找到所需的行。这是指数角色 - 可以很容易地快速存储。

ALTER TABLE `prices` ADD INDEX (`Tickers_Ticker_ID`);
ALTER TABLE `prices` ADD INDEX (`Prices_DateTime`);

因此,对于表flaggedcomments中的每一行,DBMS将能够更快地找到prices表中具有相同Tickers_Ticker_IDPrices_DateTime的行。 实际上,DBMS不会通过逐个比较所有行来扫描整个prices表,因为被编入索引,DBMS已经知道了搜索所需行的位置。

这些是一些有用的mysql链接 - 如何创建索引 - http://dev.mysql.com/doc/refman/5.0/en/create-index.html 索引之间的差异 - http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html B树和索引逻辑 - http://en.wikipedia.org/wiki/B-treehttp://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

相关问题