【问题标题】:Is there a limitation to the length of the query in mysql?mysql中查询的长度有限制吗?
【发布时间】:2016-09-14 09:31:43
【问题描述】:

我问这个问题是因为我需要知道这个限制,因为我在我的 PHP 脚本中生成 SELECT 查询并且该查询中的 WHERE 部分是在里面生成的循环。
正是它看起来像这样

 $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);

所以,这就是为什么我需要知道我的 $query 字符串可以有多长,因为数组 $uol_metadata_arr 可以包含许多项目。

【问题讨论】:

  • 我相信您主要关心的是LIKE 的大量使用(它很昂贵),而不是查询字符串的长度 本身 :)
  • 有什么建议可以将 LIKE 替换成别的东西吗?
  • FULLTEXT 索引可能是合适的。
  • 非常感谢这个问题的所有参与者。我非常感谢您的帮助。我真的很喜欢 stackoverflow,因为它的潜在用户随时准备为您提供帮助。在对我的 sql 查询进行所有这些批评之后,我决定更改我的数据库设计以跳过使用 LIKE 语句。所以现在我不会再使用这种该死的 LIKE 了。这个社区也提出了新的设计,你可以在这里看到它 - stackoverflow.com/questions/3039077/…。谢谢。

标签: php mysql


【解决方案1】:
  1. (如果可能)使用WHERE metadata IN ('value1', 'value2')
  2. 您可能需要增加max_allowed_packet。它默认为 16MB(客户端,在旧版本中低至 1MB 服务器端),并且构造一个超出该限制的查询并不难(例如,使用巨大的INSERT 从其他地方导入数据)查询)

LIKE '%string%' 是性能杀手。这样的查询不能使用该列上的索引。 LIKE 'string%' 另一方面,is indexable

【讨论】:

  • 但只有当元数据完全等于 value1 或 value2 时,才会检索 ('value1','value2') 中的元数据。在我的情况下,我需要检索类似的元数据,即我需要考虑 'sql' 和 'mysql' 是相等的字符串。
  • WHERE metadata IN ('value1', 'value2') 不会像他提到的那样做同样的事情。它不会查看“value”是否在元数据中,而是会遍历列表中的每个值(“value1”、“value2”)以查看是否有任何项目与元数据完全匹配。但是,如果涉及数十个 where 子句,OP 肯定会想要检查 max_allowed_packet
  • 文档说:“客户端和服务器都有自己的max_allowed_pa​​cket变量,所以如果你想处理大数据包,你必须在客户端和服务器中都增加这个变量. 如果你使用的是mysql客户端程序,它默认的max_allowed_pa​​cket变量是16MB" 所以好像只有mysql客户端程序默认是16MB。
  • 在服务器上,默认为[1M for 5.5] | [1M for <= 5.6.5, 4M for >= 5.6.6] | [4M for 5.7].
【解决方案2】:

查看max_allowed_packet 全局变量。您需要访问 my.cnf 文件来调整它(并且还需要在您的客户端上调整它)。典型的默认值是 1mb 或 16mb...

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2010-09-25
    • 2010-09-10
    • 1970-01-01
    • 2015-10-22
    • 2014-06-22
    相关资源
    最近更新 更多