如何找到mysql查询的连接大小?

时间:2012-10-05 12:53:04

标签: mysql phpmyadmin

我遇到了导致错误的查询:

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,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

在重写查询时,我只是将其拆分为运行两个单独的查询,首先从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

这似乎并不像一气呵成那样整洁!

1 个答案:

答案 0 :(得分:1)

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

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

如果其中一个索引已存在,请不要再次创建。

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

文档:

Optimizing Queries with EXPLAIN
CREATE INDEX Syntax
How MySQL Uses Indexes
Multiple-Column Indexes