【问题标题】:Is replacing dynamic AND with Like search ok?用 Like 搜索替换动态 AND 可以吗?
【发布时间】:2020-03-10 04:56:11
【问题描述】:

我希望在编译时生成一个 MYSQL 查询。有一些 AND 子句,我希望他们根据可选输入参数动态附加到查询中,这些参数将在运行时知道。

所以我打算进行 LIKE 搜索,而不是动态连接 AND。

假设我有一个名为“Ramakrishna”的值,查询看起来像

  SELECT * from my_table WHERE col LIKE '%Ramakrishna%'

当参数没有值时,我想像搜索一样使用

  SELECT * from my_table WHERE col LIKE '%%'

我想为查询中的 15 个参数执行此操作。 我不想为一个巨大的查询这样做,除非我知道这种方法的性能趋势。 会不会很贵?

【问题讨论】:

  • 为什么不根据输入参数生成 where 子句?
  • 查询的准备工作并不慢。它执行全表扫描。适当的全文搜索实现 solr/lucene 将搜索更好的性能增益。
  • @user9920500 。 . .我不明白这个问题。你想要什么结果?其他 14 列/参数是如何使用的?实际上,您的问题提到了“参数”,但查询没有使用其中任何一个。

标签: mysql sql performance sql-like dynamicquery


【解决方案1】:

动态构建查询。期间。

  • 通过构建查询,您将包含优化器可能遗漏的优化。

  • 查询构造的开销可能小于 MySQL 解析和优化查询的工作量。

  • 请注意,带有前导通配符的LIKE 是不可优化的。思考如何避免它。

  • 有一些多列(“复合”)索引来帮助处理通常搜索的列。 这将是最好的优化。

【讨论】:

    【解决方案2】:

    如果你可以创建包含 15 个参数的字典,那么

    with par as (
          select name_par
          from params
         )
    select *
    from my_table, par
    where col LIKE par.name_par 
    

    【讨论】:

    • 。 .你听说过JOIN吗?你应该在你的答案中使用它。
    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2020-06-12
    • 1970-01-01
    • 2015-04-30
    • 2012-01-25
    • 2017-12-23
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多