3

我有一个导致错误的查询:

错误 1104:SELECT 将检查多于 MAX_JOIN_SIZE 的行。
检查您的 WHERE 并使用 SET SQL_BIG_SELECTS=1 或 SET SQL_MAX_JOIN_SIZE=# 如果 SELECT 没问题。

我现在更改了查询,并且不再收到此错误。max_join_size = 900,000sql_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_SELECTSEXPLAIN运行 - 这是输出:

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

在重写查询时,我只是将其拆分为运行两个单独的查询,首先是 find client_id(eg 226) 和timesheet_id(eg 75) from tz_verify,然后在此查询中使用这些值:

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

这看起来不像一次性完成那么整洁!

4

1 回答 1

1

根据EXPLAIN您发布的第一个输出:

  • 我认为连接大小是:93*559*185 = 9 617 595
  • 与表连接时,您的初始查询似乎并不总是使用索引tz_sessionstz_tutor_comments. 我建议添加以下复合索引(每个索引由 2 个字段组成):
    • tz_verify:(timesheet_id,client_id)
    • tz_sessions:(timesheet_id,client_id)
    • tz_tutor_comments:(timesheet_id,client_id)

如果这些索引之一已经存在,请不要再次创建它。

添加索引后,EXPLAIN再次运行(使用初始查询)。您会注意到查询现在为每个连接使用索引(查看“key”列)。您可以再次运行初始查询,它不应再导致您遇到的错误。

文档:

使用 EXPLAIN
CREATE INDEX 语法优化查询
MySQL 如何使用索引
多列索引

于 2012-10-05T14:36:23.133 回答