【发布时间】:2013-11-16 19:36:18
【问题描述】:
我有一个小型非营利组织的捐赠者和门票销售信息数据库。我正在尝试根据捐赠、购买季票或购买单张票的人快速导出邮件列表。 “实体”表是联系信息等,然后其他表保存有关捐赠的信息(年份、金额、检查日期等),并有一个“实体号”字段,它与实体的主键匹配.recordno.
这是我正在运行的查询:
SELECT *
FROM
entity
LEFT JOIN individual_donation ON entity.recordno = individual_donation.entityno
LEFT JOIN season_tickets ON entity.recordno = season_tickets.entityno
LEFT JOIN single_tickets ON entity.recordno = single_tickets.entityno
WHERE
entity.ind_org = 'ind' AND
entity.address1 <> "" AND
(individual_donation.year <> 'NULL'
OR season_tickets.year <> 'NULL'
OR single_tickets.year <> 'NULL')
GROUP BY entity.lastname
ORDER BY entity.lastname ASC
这个数据库在 BlueHost 上,我通过 PHPmyadmin 访问它。奇怪的是,当我在 PHPmyadmin 中预览时,查询运行得很好——它返回 216 行,我可以在 SQL 命令浏览器中查看所有行,并且加载得很好。
问题是每次在查询结果操作下使用PHPmyadmin的“export”命令,都会报如下错误:
#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
每个表最多只有大约 300-400 行,所以我很惊讶我收到了 MAX_JOIN_SIZE 错误。我也很奇怪 sql 查询按原样工作得很好,但不能在导出上工作??
我确信我可以做更好的 JOIN 等,但我不明白为什么查询运行良好,但不会导出。
编辑: 这是 EXPLAIN EXTENDED 结果
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE entity ALL NULL NULL NULL NULL 429 100.00 Using where; Using temporary; Using filesort
1 SIMPLE individual_donation ALL NULL NULL NULL NULL 221 100.00
1 SIMPLE season_tickets ALL NULL NULL NULL NULL 102 100.00
1 SIMPLE single_tickets ALL NULL NULL NULL NULL 217 100.00 Using where
更多信息: 奇怪 - 我的虚拟主机不允许 mysql 用户具有 FILE 权限,所以我不能使用 EXPORT INTO。我尝试使用 ssh 访问,将查询运行到 > 到一个文件中,我得到了 MAX_JOIN_SIZE 错误。我仍然不明白为什么它可以在浏览器的 phpmyadmin 查询中正常工作,但不能在 phpmyadmin 中导出,也不能从命令行工作。
【问题讨论】:
-
SELECT @@max_join_size的输出是什么?默认值为 4294967295。 -
输出为 1000000000。
-
十亿?这还是相当高的。即使是这几百行中的偶然full Cartesian product 也不太可能达到这个数字。您能否在查询中添加
EXPLAIN EXTENDED并将其编辑到您的问题中? -
添加了上面的 EXPLAIN EXTENDED 结果,以及更多注释。
标签: php mysql sql phpmyadmin