【发布时间】:2015-10-30 15:30:13
【问题描述】:
我有一个庞大的数据库(每个表中包含近 200 000 行以及许多这样的表)。我必须对其进行查询。数据存储在 MySQL 中,我不能使用任何其他数据库。在我的查询中,我必须执行 UNION 的表。我的查询是这样的:
select * from table1
UNION
select * from table2
...
select * from tablen;
但是当我这样做时,我得到了这个错误
表'/tmp/#sql_d3d_0.MYI'的密钥文件不正确;尝试修复 它'
我认为这是因为加入了太多包含太多数据的表。如何优化我的查询,使其不会产生此问题并且查询变得更快?
【问题讨论】:
-
MySQL != Sql Server - 选择标签时请小心。
-
查找表之间的关系并进行连接
-
第一个建议是尽量避免使用
select *。使用列名(即使是所有列名)使您的代码更易于理解和维护,并且有助于防止表结构发生变化时出现意外情况。 -
你能用
UNION ALL代替UNION吗?这样,服务器就不必对您的结果进行重复数据删除,这可能就是它试图将所有数据填充到临时表中的原因。如果您使用的是 v5.7.3 以上的 MySQL 服务器,UNION ALLdefinitely should be an improvement overUNIONfor temp table space。 (是否可以使用UNION ALL取决于您的实际数据以及您如何使用这些结果,因此只有您可以回答...) -
(投票重新打开,因为在这种情况下,我认为 可以 为这个特定的查询模式做一些事情来避免使用临时空间。所有的答案重复似乎只是涉及使临时空间更大,而不是使查询结果不那么需要临时...)