2009-06-04 36 views
25

嘿,我一直在調查SQL_BIG_SELECTS,但迄今爲止MySQL文檔已經相當無益。我正在尋找一些洞察力來防止出現像下面這樣的錯誤。MySQL - SQL_BIG_SELECTS

ERROR 1104: The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok

  1. 在多少行不MySQL的決定,查詢是「大SELECT」?
  2. 適當的索引通常能解決這個問題嗎?
  3. SQL_BIG_SELECTS被認爲是「最後的手段」,還是很好的做法?
  4. 某人在配置中如何設置「SQL_BIG_SELECTS = 1」(而不必執行查詢)?
  5. 是否有任何其他選擇值得了解?

在此先感謝!

回答

38
  1. MySQL根據'max_join_size'的值確定查詢是否是'大選擇'。如果查詢可能需要檢查超過這個數量的行,它會認爲它是一個「大選擇」。使用'show variables'查看最大連接大小的值。

  2. 我認爲索引和特別是一個好的where子句可以防止發生這個問題。

  3. SQL_BIG_SELECTS用於防止用戶意外執行過大的查詢。可以在mysql.cnf中將其設置爲ON或在啓動時使用命令行選項。

  4. 您可以在my.cnf或服務器啓動時設置SQL_BIG_SELECTS。它也可以使用SET SESSION SQL_BIG_SELECTS=1進行會話設置。

  5. 不是我能想到的。我只是檢查你的查詢,以確保你真的需要使用它。我們的服務器默認打開它,並且max_join_size非常大。

+0

很大的幫助,謝謝! – Matt 2009-06-04 13:42:31

+2

在「連接」中使用的表上設置正確的索引也可以解決問題 - 只是這樣做。 – 2012-01-15 14:16:21

2

無法在my.cnf或者在服務器啓動時設置SQL_BIG_SELECTS因爲它是一個會話唯一的參數。我正在使用MySQL 5.0.60。

1

由於以前有人發帖,您無法在服務器啓動時在my.cnf上設置SQL_BIG_SELECTS。這種變量不支持。

我曾與一個Symfony的應用程序相同的問題出這惱人的錯誤:

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay 

但是你可以增加varialbe數量

這與使用max_join_size到SQL_BIG_SELECTS

我能修復它執行一個命令作爲特權的mysql用戶:

# SET GLOBAL max_join_size=18446744073709551615; 

或者你可以把它包括在我的。cnf,因爲max_join_size允許在配置文件中設置

嗯,我希望這可以幫助別人。

0

下面的命令對我的作品

SET GLOBAL max_join_size=18446744073709551615; 

但我需要什麼就擺在my.cnf文件,而不是命令? 順便說一句,我正在使用「5.6.12 MySQL社區服務器」

0

我有超過2000k的記錄在db中,被告知同樣的mysql(當前版本的答案爲準),我結束了對參與where第2場使用index ......這應該幫助別人太...它爲我工作的步驟是:

  1. 設置指數
  2. 分析表
  3. 運行查詢

HTH

-1
SET SESSION SQL_BIG_SELECTS =1;# MySQL returned an empty result set (i.e. zero rows). 
SELECT a.`HACtrl` , b.`HBCtrl` , c.`HDCtrl` 
FROM `HO110BLote` AS a 
LEFT JOIN `HO113BPago` AS b ON (b.HBHACtrl = a.HACtrl) 
LEFT JOIN `HO113BRecibos` AS c ON (c.HDHBCtrl = b.HBCtrl) 
WHERE HAManzana = '03' 
AND HALote = '09' 
LIMIT 0 , 100