基于函数的数字索引

时间:2011-03-25 13:34:03

标签: mysql indexing sql-tuning

我有一个包含一些数字列的表,我必须将它们保持数字,因为大部分时间我都会从中受益。但我还需要使用部分匹配对这些列进行泛型搜索,所以在我的where语句中我会有类似

的内容
...where num_col1 like "1234%...

我的问题是:

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

如果不是,您是否有任何其他建议如何加快我的查询结果?

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

先谢谢大家, 最好的,N。

2 个答案:

答案 0 :(得分:2)

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

从我的on function based indexes in MySQL

中引用注释SQL Indexing Tutorial
  

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

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

答案 1 :(得分:1)

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