我有一张包含150万条记录的表prices
,我有一张包含1500条记录的表flaggedcomments
。
表flaggedcomments
包含以下列:
表prices
具有以下列(它们都填充了值):
这是我的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
表中的flaggedcomments
与Prices_DateTime
表中的prices
匹配;与Tickers_Ticker_ID
和flaggedcomments
中的prices
匹配,然后将Prices_DateTime
和Prices_Open
从prices
表填入flaggedcomments
}。
语法已于2小时前执行,并且仍在运行(在MySQL工作台中执行此操作)。我还尝试从我的程序的datagridview中查找flaggedcomments
,这两列似乎仍然是完全空的。
我一直在纠正我的语法,目前看起来是正确的,但我不知道它是否有任何问题?有人可以建议或指出问题吗?或者仅仅是因为大桌子?
非常感谢您的帮助。谢谢!
答案 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_ID
和Prices_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-tree和http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html