如何查找mysql查询的联接大小?

如何查找mysql查询的联接大小?,mysql,phpmyadmin,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. 我可以临时启用SQL\u BIG\u SELECTS以运行EXPLAIN——以下是输出: id select_type table

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

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. 我可以临时启用
SQL\u BIG\u 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
在重写查询时,我只是将其拆分为两个单独的查询,首先从
tz\u verify
中查找
client\u id
(例如226)和
timesheet\u id
(例如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;
以下是
解释

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

这看起来不像一次完成那么简单

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

  • 我认为连接大小是:93*559*185=9617595
  • 当与表
    tz_sessions
    tz_tutor_comments
    连接时,您的初始查询似乎并不总是使用索引。我建议添加以下复合索引(每个索引由2个字段组成):
    • 表<代码>tz\u验证:(时间表id、客户id)
    • tz_会话
      :(时间表id、客户id)
    • tz\u导师\u评论
      :(时间表id,客户id)
如果其中一个索引已经存在,请不要再次创建它

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

文档:



能否将其包装在COUNT()样式的查询中?但它仍可能抛出错误。您的查询可能已优化。你能用你的查询和执行计划(解释你的查询的输出)编辑你的帖子吗?@Randy如果我没有正确理解这一点,很抱歉,但这是否会导致返回的行的最终数量?在这个特定的查询中,我最多只检索大约5行。正如我提到的,我现在已经重写了查询,它不再抛出错误。我仍然想知道得到的连接大小是多少,看看它离最大连接大小有多近。你是对的-我误解了最初的问题。sorry@Jocelyn我已经发布了你要求的信息。正如我提到的,我的“解决方案”是将查询分为两个独立的查询,但对这类事情没有太多经验,我不确定这是否是最好的主意!谢谢。谢谢你对我最初的问题给出了非常清晰的回答,并向我展示了如何正确地解决它!按照说明操作后,原始查询从9617595行减少到99行。显然,我需要仔细阅读索引——我不知道复合索引的存在。再次感谢。如果您需要进一步阅读,我在我的答案中添加了文档链接。
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