2011-03-25 89 views
0

我有一个包含一些数字列的表,并且我必须将它们保留为数字,因为大部分时间我都会从中受益。但我也需要作出关于使用部分匹配这些列的通用搜索,以便在我这里声明,我将有类似基于函数的数字列索引

...where num_col1 like "1234%... 

我的问题是:

我可以做一个函数的索引上num_col1铸造该列为CHAR?我尝试过,但似乎不可能。

如果不是,你们有什么其他建议,我怎么能加快我的查询结果?

我读过一些可能的解决方案可能是要创建一个我原来的表视图,并在那里改变列类型varchar和索引该列或另一个解决方案可能是添加一个额外的varchar列到我的表和索引那。我想避免这两种解决方案,因为我有一个非常大的表,其中包含大量的行和大量的列。

在此先感谢大家, 最佳,N.

回答

1

我觉得自己的直觉使用的观点是正确的,从复制数据保持。但是,在一种情况下通过数字优化需求并在另一种情况下进行字符串搜索?根据这些情况,查看编号系统以查看是否可以在数字范围(x> = 12340和x < 12350)上进行搜索会比字符串比较快得多。

+0

该视图不是可变的,因为我正在更新并经常在原始表中插入大量数据。并在范围内搜索,因为可以说我有一个包含12345678的列,如果用户搜索“1234”,我希望此列在我的查询结果中。 – kefer9 2011-03-25 13:43:49

+0

我会这样做以提高速度,然后..首先,拉回最大ID以查看数字的大小。然后让SQL生成对象/脚本生成一个WHERE,它可以搜索每个范围,最大数字位数。因此,如果您的最大ID为999999,并且用户输入“1234”,则生成的WHERE子句将为:“WHERE(id> = 1234 AND id <1235)OR(id> = 12340 AND id <12350)OR(id> = 123400和id <123500)“。这需要一点逻辑,但是如果视图不可行并且性能很重要,那么在数据库上就会很容易。 – roberttdev 2011-03-25 13:47:22

+0

@robert - 不是一个坏的方法 - 看起来有点臃肿,但可能解决了这个问题。对于正在搜索的内容的实际要求仍不清楚。它始终是开头的4位数字吗?注意'智能'键总是一个问题 - 所以我建议回到原来的桌面设计,也许首先将其分开。 – Randy 2011-03-25 13:54:02

2

MySQL没有基于函数的索引,虚拟列或索引视图(afaik)。

从我SQL Indexing Tutorial引述注on function based indexes in MySQL

的备份解决方案是在保持表达式的结果表中创建一个真正的列。该列必须由触发器或应用程序层维护 - 任何更合适的。新列可以像任何其他索引一样,SQL语句必须查询新列(不含表达式)。

但是,在您的特定情况下,可能存在您用任何LIKE表达式'%1234%'过滤的风险。在这种情况下,b-tree不会帮助(在LIKE performance tuning/indexing中解释)。这将需要全文索引,仅适用于MyISAM。

+0

我读了那篇报价,我想避免的是添加基本上只是复制原始报表的列,他们只是有不同的类型。所以创建一个仅包含文本列的镜像表会更有意义。回答你的帖子的最后一部分否,我不会面对'%1234%'的情况。我将只有'1234%',所以索引将在这些情况下工作:) – kefer9 2011-03-25 14:15:25

+1

@Kaiser基于函数的索引是您需要的功能。它仍然复制数据,但只在索引中。 MySQL没有它们,所以你需要去备份解决方案(假设你不能使用支持基于函数索引的广告数据库)。备份解决方案将复制表中的AND数据。你有奇怪的,你需要查询WHERE子句中的不同列。这是通用的备份解决方案... – 2011-03-25 14:20:48

+0

这正是我不想听到哈哈:)我可能会去备份解决方案然后;)感谢马库斯。 – kefer9 2011-03-25 14:25:34