【问题标题】:How to effectively search through MySQL DB with multiple searcheable columns?如何使用多个可搜索列有效地搜索 MySQL DB?
【发布时间】:2013-06-20 08:30:21
【问题描述】:

我有一个包含 60 个布尔 (TINYINT(1)) 可搜索列的表。用户可以使用给定列的任何子集作为搜索条件。基于此,我无法为我的需要创建一个好的索引。我想知道我是否可以创建另一个类型为 BIT(60) 的列 (concat_col),它将是可搜索列的连接,即

Table_A:
id   |col1|col2|...|col60|concat_col
9999 | 1  | 0  |...|  1  |10...1

然后我可以为它创建一个好的索引(在 concat_col 上)但是有一个问题 - 我如何为它创建一个查询?

请看这个用伪代码编写的例子:

标准版(这显然可以正常工作):

SQL = SELECT * FROM Table_A WHERE col1=1 AND col60=1 

我的版本('*' 是通配符,因为它既不是 '1' 也不是 '0'):

SQL = SELECT * FROM Table_a WHERE concat_col = '1*...1'    

有没有可能有效地解决这个问题?非常感谢您的帮助!

【问题讨论】:

  • 我会给你一个想法,因为你自己的路很好。您有 60 列。第一列是 2 的 0 次方。第二列是 2 的 1 次方。第三列是 2 的 3 次方。依此类推,直到达到 60。因此,您可以用单个数字来描述列的任意组合。
  • @N.B.谢谢您的帮助。但是,我认为我将无法实现我真正需要的。事实上,我将能够用数字描述列的任何组合,但我需要忽略除我感兴趣的列之外的所有列(在本例中为 col1 和 col60)。所有其他列的值都不重要。你的想法可行吗?
  • 是的,这是可行的 :) 想象一下,如果您只想检查第 1 列和第 3 列。描述该组合的数字是十进制 5。第一列 = 1 (2 pow 0 = 1),第二列被跳过 (0),第三列是 2 pow 2 = 4. 4 + 1 = 5。
  • 是的,我同意。但这假设所有其他位都是零 (0)。如果他们不是呢?如果即第 2 列也是 1,则 1+2+4=7。这意味着 7 也应该匹配我的查询。
  • 没有。您不想引用的列始终为 0。您想要引用的列始终为 1。然后,当您将所有 60 列排成一行时,您会得到一个 1 和 0 的流,这是一个二进制数。这意味着您可以将该二进制数转换为十进制数。然后可以对十进制数进行索引。

标签: mysql sql indexing


【解决方案1】:

尝试:

SQL = SELECT * FROM Table_a WHERE concat_col REGEXP '^1[0-9a-zA-Z]{58}1$'

【讨论】:

  • 谢谢,我会的。它会有效并使用索引吗?这是我最关心的问题。
  • 是的,如果添加索引会更快,这会占用磁盘/内存上的一些空间和内存
  • 不,不会。索引将具有可怕的基数。每次都会进行全表扫描。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2016-07-15
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多