我遇到了导致错误的查询:
ERROR 1104: The SELECT would examine more rows than MAX_JOIN_SIZE. Check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is ok.
我现在已经更改了查询,我不再收到此错误。 max_join_size = 900,000
和sql_big_selects = 0
。不幸的是我没有ssh访问权限,我必须使用phpmyadmin。
所以我的问题是,有没有办法确定特定查询将检查多少行?我想看看查询与max_join_size限制的接近程度。
编辑:这是原始查询:
SELECT * FROM `tz_verify`
LEFT JOIN `tz_sessions` ON `tz_sessions`.`timesheet_id` = `tz_verify`.`timesheet_id`
AND `tz_sessions`.`client_id` = `tz_verify`.`client_id`
LEFT JOIN `tz_clients` ON `tz_sessions`.`client_id` = `tz_clients`.`id`
LEFT JOIN `tz_tutor_comments` ON `tz_sessions`.`timesheet_id` = `tz_tutor_comments`.`timesheet_id`
AND `tz_sessions`.`client_id` = `tz_tutor_comments`.`client_id`
LEFT JOIN `tz_notes` ON `tz_sessions`.`notes` = `tz_notes`.`id`
WHERE `tz_verify`.`code` = 'b65f35601c' AND `confirmed` = 0;
我可以暂时启用SQL_BIG_SELECTS
让EXPLAIN
运行 - 这是输出:
id select_type table type possible_keys key ref rows extra
1 SIMPLE tz_verify ALL NULL NULL NULL 93 Using where
1 SIMPLE tz_sessions ALL NULL NULL NULL 559
1 SIMPLE tz_clients eq_ref PRIMARY PRIMARY tz_sessions.client_id 1
1 SIMPLE tz_tutor_comments ALL NULL NULL NULL 185
1 SIMPLE tz_notes eq_ref PRIMARY PRIMARY tz_sessions.notes 1
在重写查询时,我只是将其拆分为运行两个单独的查询,首先从client_id
查找timesheet_id
(例如226)和tz_verify
(例如75),然后使用此查询中的这些值:
SELECT * FROM `tz_sessions`
LEFT JOIN `tz_clients`
ON `tz_clients`.`id` = 226
LEFT JOIN `tz_tutor_comments`
ON `tz_tutor_comments`.`timesheet_id` = 75
AND `tz_tutor_comments`.`client_id` = 226
LEFT JOIN `tz_notes`
ON `tz_sessions`.`notes` = `tz_notes`.`id`
WHERE `tz_sessions`.`client_id` = 226 AND `tz_sessions`.`timesheet_id` = 75;
以下是EXPLAIN
:
id select_type table type possible_keys key ref rows extra
1 SIMPLE tz_sessions ALL NULL NULL NULL 559 Using where
1 SIMPLE tz_clients const PRIMARY PRIMARY const 1
1 SIMPLE tz_tutor_comments ALL NULL NULL NULL 185
1 SIMPLE tz_notes eq_ref PRIMARY PRIMARY tz_sessions.notes 1
这似乎并不像一气呵成那样整洁!
答案 0 :(得分:1)
根据您发布的EXPLAIN
的第一个输出:
tz_sessions
和tz_tutor_comments
时,您的初始查询似乎并不总是使用索引。我建议添加以下复合索引(每个索引由2个字段组成):
tz_verify
:( timesheet_id,client_id)tz_sessions
:( timesheet_id,client_id)tz_tutor_comments
:( timesheet_id,client_id)如果其中一个索引已存在,请不要再次创建。
添加索引后,再次运行EXPLAIN
(使用初始查询)。您会注意到查询现在正在为每个连接使用索引(请查看“key”列)。您可以再次运行初始查询,它不应再导致您的错误。
Optimizing Queries with EXPLAIN
CREATE INDEX Syntax
How MySQL Uses Indexes
Multiple-Column Indexes