我有一个 MySql 表,我想在其中获取给定 VARCHAR 列具有数值(可转换为数字,您知道)的行数。现在,我正在对该字段进行简单的 REGEXP 检查。由于此表非常大,我使用了一系列索引来对尽可能少的行进行 REGEXP。
但是这个 VARCHAR 列也被索引了。我可以利用 MySql 索引算法来扫描更少的行吗? :-/这是一个 InnoDB 表。
最佳答案
您可能不喜欢这样,因为您可能已经在尝试避免这种情况,但是当我遇到这种情况时,我并没有尝试做一些聪明的把戏,而是添加了一个额外的列,将 varchar 存储在数字列中(使用触发器更新),并对其进行查询。
但是,有一种方法我可以做到(虽然我从来没有理由在生产中这样做),这是利用索引将按顺序排列值的事实,这样所有的开始与一个数字一起排序。
假设有这样一张表:
CREATE TABLE `test_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`text_or_number` varchar(255),
PRIMARY KEY (`id`),
KEY `test_1_idx` (`text_or_number`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
您可以利用 utf8 字符的顺序只选择以数字开头的值 - http://en.wikipedia.org/wiki/UTF-8#Examples
utf-8 中 0 之前的最小值是“/”,0 之后的最大值是“:”,所以这应该只提取以数字开头的值:
select cast(text_or_number as unsigned)
from test_1
where text_or_number < ':'
and text_or_number > '/'
and cast(text_or_number as unsigned) > 0;
它仍然可以包含以数字开头但不以 1 结尾的值,这就是我添加 cast(...) > 0 子句的原因,但我认为 mysql 将足够聪明以运行 where子句顺序,因此希望它只会对以数字字符开头的行子集运行强制转换。
关于mysql - 使用索引语义确定 MySql 索引列中的字段是否为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996994/