Mysql 基于数字列的函数索引

Mysql 基于数字列的函数索引,mysql,indexing,sql-tuning,Mysql,Indexing,Sql Tuning,我有一个包含一些数字列的表,我必须让它们保持数字,因为大多数时候我会从中受益。但我还需要使用部分匹配对这些列进行一般性搜索,因此在where语句中 ...where num_col1 like "1234%... 我的问题是: 我可以基于num_col1创建一个函数索引,将列转换为CHAR吗?我试过了,但似乎不可能 如果没有,你们对如何加快我的查询结果有什么其他建议吗 我了解到一些可能的解决方案可以是创建原始表的视图,然后将列类型更改为varchar并索引该列,或者另一个解决方案可以是向我的表

我有一个包含一些数字列的表,我必须让它们保持数字,因为大多数时候我会从中受益。但我还需要使用部分匹配对这些列进行一般性搜索,因此在where语句中

...where num_col1 like "1234%...
我的问题是:

我可以基于num_col1创建一个函数索引,将列转换为CHAR吗?我试过了,但似乎不可能

如果没有,你们对如何加快我的查询结果有什么其他建议吗

我了解到一些可能的解决方案可以是创建原始表的视图,然后将列类型更改为varchar并索引该列,或者另一个解决方案可以是向我的表中添加一个额外的varchar列并索引该列。我希望避免使用这两种解决方案,因为我有一个非常大的表,其中已经包含了大量的行和列

提前感谢大家,,
最好的,N.

我认为你使用视图的本能是正确的,避免复制数据。但是,在一种情况下通过数字优化,在另一种情况下通过字符串搜索优化的需求是什么?根据这些情况,查看一下编号系统,看看是否可以搜索比字符串比较快得多的数字范围(x>=12340和x<12350)。我认为您使用视图的本能是正确的,避免重复数据。但是,在一种情况下通过数字优化,在另一种情况下通过字符串搜索优化的需求是什么?根据这些情况,可以查看一下编号系统,看看是否可以搜索比字符串比较快得多的数字范围(x>=12340和x<12350)。

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

引用我父亲的话:

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


但是,在您的特定情况下,可能存在使用类似anywhere的表达式“%1234%”进行筛选的风险。在这种情况下,b-tree将没有帮助(在中解释)。这需要全文索引,它只适用于MyISAM。

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

引用我父亲的话:

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


但是,在您的特定情况下,可能存在使用类似anywhere的表达式“%1234%”进行筛选的风险。在这种情况下,b-tree将没有帮助(在中解释)。这将需要全文索引,这只适用于MyISAM。

视图不可用,因为我经常在原始表中更新和插入大量数据。如果用户搜索“1234”,我希望该列出现在我的查询结果中,我会这样做以提高速度。。首先,向后拉max ID以查看数字大小。然后,让SQL生成对象/脚本生成一个搜索每个范围的最大位数。因此,如果您的最大ID为999999,并且用户输入“1234”,则生成的WHERE子句将是:“WHERE(ID>=1234且ID<1235)或(ID>=12340且ID<12350)或(ID>=123400且ID<123500)”。这需要一点逻辑性,但是如果视图不可行并且性能很重要,那么在DB上就很容易了。@robert——这不是一个坏方法——看起来有点臃肿,但可能解决了问题。搜索内容的实际要求仍不清楚。它总是开头的4位数吗?注“智能”键始终是一个问题-因此我建议回到原始的表设计,可能首先将其拆分。@randy同意。。我的操作假设表已经被大量使用,因此重新设计成本很高,但是如果重新设计是一种选择,那么拆分是最好的选择。试试看。。即使有一长串动态生成的“或”,我的猜测是,与数百万个字符串相比,它仍然会比一个字符串快得多。不过,根据数据库的设置,也有可能是YMMV。视图是不可伪造的,因为我经常在原始表中更新和插入大量数据。如果用户搜索“1234”,我希望该列出现在我的查询结果中,我会这样做以提高速度。。首先,向后拉max ID以查看数字大小。然后,让SQL生成对象/脚本生成一个搜索每个范围的最大位数。因此,如果您的最大ID为999999,并且用户输入“1234”,则生成的WHERE子句将是:“WHERE(ID>=1234且ID<1235)或(ID>=12340且ID<12350)或(ID>=123400且ID<123500)”。这需要一点逻辑性,但是如果视图不可行并且性能很重要,那么在DB上就很容易了。@robert——这不是一个坏方法——看起来有点臃肿,但可能解决了问题。搜索内容的实际要求仍不清楚。它总是开头的4位数吗?注“智能”键始终是一个问题-因此我建议回到原始的表设计,可能首先将其拆分。@randy同意。。我的操作假设表已经被大量使用,重新设计是最重要的