我遇到InnoDB的问题(表最初是MyISAM,但是前一段时间将它转换为InndoB)表;我正在尝试运行此查询:
SELECT
posts.id,
posts.post_title
FROM
rss_posts AS posts
INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id
WHERE
feeds.blog_language=1
ORDER BY
posts.post_date_db DESC
LIMIT
10;
我收到此错误:
Query : SELECT posts.id,posts.post_title FROM rss_posts AS posts INNER JOIN vw_rss_feeds AS feeds ON posts.blog_id=feeds.id WHER...
Error Code : 126
Incorrect key file for table '/tmp/#sql_7375_0.MYI'; try to repair it
我不能对所涉及的表进行修复;不过我已经对两张桌子都进行了检查。他们看起来很好。我在两张桌子和桌子上都做了一个OPTIMIZE。通过以下方式重建表格。
INSERT INTO new_table SELECT * FROM old_table;
然后我将新表重命名为旧表名.....但我仍然遇到这个问题。
尝试&找出导致它的表是什么我删除了引用“rss_feeds”表的查询中的代码....所以现在查询看起来像这样..
SELECT
posts.id,
posts.post_title
FROM
rss_posts AS posts
ORDER BY
posts.post_date_db DESC
LIMIT
10;
那很有效。
所以这个问题与rss_feeds表有关。
然后我想我会将表格转换回MyISAM&进行维修&然后转换回InnoDB .....这暂时工作,它恢复正常....然后再次破坏.....再次修复它,再次破坏....现在修复似乎没有工作。
现在,我知道,我知道......我已经在谷歌上搜索过这个问题了......我注意到问题的重要性在那里我们没有足够的空间在MySQL临时目录....但我已经让主持人将临时目录更改为更多空间&问题仍然存在。
我认为主持人应该责备&它仍然是临时目录的一个问题;为什么?因为在我再次使用它之后我再次开始向rss_posts表中添加数据&因此,JOIN将获得更大和更多MySQL会再次耗尽空间....你怎么看?
答案 0 :(得分:5)
这里发生的是MySQL通过从两个表的连接构建临时表来执行ORDER BY。临时表太大而无法放入内存中,因此MySQL会创建一个临时文件。
有一些事情会阻止它正常工作。原始磁盘空间是一个。 ulimit是另一个。如果正在托管它,它们可能会对您的磁盘使用量有一个配额(除了ulimit)。
我建议在查询中添加限制条款。目前,您将rss_posts和rss_feeds的全部内容加载到临时表中以进行排序。如果您只想要最新的10个数据,那么您需要的数据远远多于您真正需要的数据。
SELECT posts.id, posts.post_title
FROM rss_posts AS posts INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id
WHERE feeds.blog_language=1
AND posts.post_data_db > (now - interval 30 day);
ORDER BY posts.post_date_db DESC LIMIT 10;
答案 1 :(得分:2)
看起来您对临时表的磁盘配额太小了。
BTW:没有必要在InnoDB表上运行REPAIR,因为所有维护都是由存储引擎本身完成的。他们也没有损坏的密钥文件。
答案 2 :(得分:1)
请注意,有问题的.MYI文件是临时表。当您运行涉及联接的查询时,MySql需要使用临时空间在内部合并数据。您很可能在tmp目录中空间不足。
尝试增加分配给tmpdir的空间量或编辑my.cnf文件,让tmpdir指向一个有足够空间的地方(不要忘记赋予它权限)。