2010-06-11 156 views
7

我在問這個問題,因爲我需要知道這個限制,因爲我正在生成SELECT查詢我的PHP腳本和的部分在這個查詢中是在循環內部生成的。
正是它看起來像這樣是否對mysql中的查詢長度有限制?

$query="SELECT field_names FROM table_name WHERE "; 
$condition="metadata like \"%$uol_metadata_arr[0]%\" "; 
for($i=1; $i<count($uol_metadata_arr); $i++){ 
    $condition.=" OR metadata like \"%$uol_metadata_arr[$i]%\" "; 
} 
$query.=$condition; 
$result=mysql_query($query); 

所以,這就是爲什麼我需要知道我的$查詢字符串可以有多長,因爲數組$ uol_metadata_arr可以包含多個項目。

+2

我相信你的主要關注點應該是大量使用LIKE(這很貴),而不是查詢字符串的_length_本身* :) – jensgram 2010-06-11 20:49:58

+0

任何建議把LIKE替換成別的東西? – Bakhtiyor 2010-06-11 20:53:27

+1

FULLTEXT索引可能是合適的。 – 2010-06-11 21:00:56

回答

13
  1. (如果可能)使用WHERE metadata IN ('value1', 'value2')
  2. 您可能需要增加max_allowed_packet。它默認爲16MB(客戶端,在舊版本中低至1MB服務器端),並且構建一個針對該限制運行的查詢並不難(例如,從其他地方導入數據時使用巨大的INSERT查詢)

LIKE '%string%'是一個性能殺手。這樣的查詢不能使用該列上的索引。 LIKE 'string%'另一方面,is indexable

+0

但其中的元數據('value1' ,'value2')僅在元數據完全等於value1或value2時檢索。在我的情況下,我需要檢索類似的元數據,即我需要考慮'sql'和'mysql'是相等的字符串。 – Bakhtiyor 2010-06-11 20:52:56

+1

'WHERE元數據IN('value1','value2')'不會像他所說的那樣做同樣的事情。它不會查看'值'是否在元數據中,而是會遍歷列表中的每個值('value1','value2')以查看是否有任何項與元數據完全匹配。但是,如果涉及數十個where子句,則OP將肯定希望檢查出所提及的'max_allowed_pa​​cket'。 – Joseph 2010-06-11 21:02:06

+0

indexable == sargable – 2010-06-11 21:32:36

5

請參閱max_allowed_packet全局變量。您需要訪問my.cnf文件來調整它(並且需要在客戶端上調整它)。典型的默認值是1mb或16mb ...