【问题标题】:Which query would be more optimal?哪个查询会更优化?
【发布时间】:2013-12-15 20:48:31
【问题描述】:

目前我们有以下组合不同的数据,即一个用逗号分隔,一个没有逗号分隔在同一张表中。

#1

id | values    
------------   
1  | 1,2,3
2  | 4,5,6
3  | 7,8,9
4  | 1
5  | 2
6  | 3
7  | 4
8  | 5

假设我想从表中搜索值1 并计算它。查询这种数据结构的最佳方式是什么?是否使用:

  • WHERE value =
  • WHERE value LIKE
  • WHERE value IN

或者我是否需要更改我的数据库并让所有值都采用相同的格式?

我们将不胜感激任何有关最佳做法的帮助或建议。

【问题讨论】:

  • WHERE with "="WHERE INWHERE with "LIKE"
  • 还记得像 1 一样会匹配 "1,11,12,13,14,15,etcetc"
  • @Dave:有一些方法可以匹配正确的值,但是太丑了:stackoverflow.com/a/18657144/1682509
  • 带有或开关的子点赞是解决类似问题的可怕解决方案。正如 Juergen 所说,将数据标准化为内容表和索引表要好得多

标签: php mysql database database-design laravel-4


【解决方案1】:

我同意规范化您的数据是获得最佳性能的方法。但不改变模式,你不能真正使用=,因为你可能有多个数字。计算这些逗号分隔值中 1 出现次数的一种方法是使用FIND_IN_SET()

SELECT SUM(CASE 
      WHEN FIND_IN_SET(1, `values`)
        THEN 1
      ELSE 0
      END) AS count1
FROM tab1

sqlfiddle demo

【讨论】:

  • 出于兴趣,我假设这样做的查询开销很大?
  • 我确信这不是提高性能的最佳方法,不。这不会利用索引。
【解决方案2】:

切勿在一列中存储多个值!

请标准化您的数据。这使得查询更容易,而且速度更快,并且可以利用索引。

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2023-03-27
    • 2022-01-20
    • 2017-01-11
    • 2013-09-09
    • 1970-01-01
    • 2021-07-10
    • 2015-11-08
    相关资源
    最近更新 更多