gpt4 book ai didi

MySQL从左连接和右连接的结果插入导致内存问题

转载 作者:行者123 更新时间:2023-11-29 11:34:25 24 4
gpt4 key购买 nike

我在 2 个大表上运行插入查询时遇到问题。一张表是67,000,000,另一张表是100,000。我正在尝试对两个表进行左连接和右连接,并将结果放入另一个表中。该查询在 1M 条目以下的较小表上运行完美。但当到达更高的条目时,它就会爆炸。我收到此错误:

Incorrect key file for table 'C:\Windows\TEMP\#sql3838_2_6.MYI'; try to repair it

在线阅读解决方案后,他们说增加 mysql 使用的内存及其用于索引的键。我已经尝试过了,但仍然遇到同样的问题。我现在不确定这是否是 mysql 的错误配置或 bar 编写的查询。

所以我真的在寻找优化查询的解决方案,以便提高内存效率或更改 my.config 来处理查询。或者将查询拆分为 2 个不同的插入???那会有帮助吗?

MySQL 查询

INSERT INTO schema.orphan_results (_Doc_ID, Orphan_Entries, Entries_Table, Orphan_File) 
SELECT C.A__Doc_ID, C.A_File, C.A_Table, C.B_File
FROM( SELECT A._Doc_ID AS A__Doc_ID, A.File AS A_File, A.Table AS A_Table, B.File AS B_File
FROM schema.Temp_Entries A
LEFT JOIN schema.temp_dir_scan B ON A.File = B.File
UNION SELECT A._Doc_ID as A__Doc_ID, A.File AS A_File, A.Table AS A_Table, B.File AS B_File
FROM schema.Temp_Entries A
RIGHT JOIN schema.temp_dir_scan B ON A.File = B.File) C
WHERE C.A_File IS NULL OR C.B_File IS NULL

这是 MySql 的 my.config

default-storage-engine=INNODB
max_connections=800
query_cache_size=186M
table_cache=1520
tmp_table_size=900M
thread_cache_size=38
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=268M
key_buffer_size=1160M
read_buffer_size=128K
read_rnd_buffer_size=512K
sort_buffer_size=512K
innodb_additional_mem_pool_size=96M
innodb_buffer_pool_size=563M

我的系统

16 Gigs of Mem
52 Gigs of Free disk space.

最佳答案

该错误消息通常是由于磁盘空间不足而导致的,但由于 52gigs 应该足够了(我假设您的文件系统可以处理 >2gb 文件),因此可能会有所不同。

以下两件事应该可以限制所需的临时空间:

  • 您应该为 temp_dir_scan.File 和 Temp_Entries.File 创建索引。

  • 您应该使用“union all”而不是“union”(或者按照您的建议,拆分查询)。

您可以重写您的代码(仍然请创建索引):

INSERT INTO schema.orphan_results (_Doc_ID, Orphan_Entries, Entries_Table, Orphan_File) 
SELECT A._Doc_ID, A.File, A.Table, null
FROM schema.Temp_Entries A
where not exists (select 1 from schema.temp_dir_scan B where A.File = B.File)
-- or a.file is null -- you might need that if a.file can be null

INSERT INTO schema.orphan_results (_Doc_ID, Orphan_Entries, Entries_Table, Orphan_File)
select null, null, null, B.File
from schema.temp_dir_scan B
where not exists (select 1 from schema.Temp_Entries A where A.File = B.File)

由于 UNION 有一个内置的 distinct (尽管我不确定您是否意识到这一点),您可能需要使用 select unique A._Doc_ID ...,但如果你真的不需要它,就不要!

关于MySQL从左连接和右连接的结果插入导致内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36849503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com