1

我有一个 MySql 表,我想在其中获取给定 VARCHAR 列具有数值的行数(可以转换为数字,你知道)。现在,我正在对该字段进行简单的 REGEXP 检查。由于该表非常大,因此我使用一系列索引 REGEXP 尽可能少的行。

但是这个 VARCHAR 列也被索引了。我可以利用 MySql 索引算法的巧妙破解来扫描更少的行吗?:-/ 这是一个 InnoDB 表。

4

1 回答 1

1

您可能不喜欢这样,因为您可能已经在尝试避免它,而是尝试做一些聪明的技巧,当我遇到这样的情况时,我添加了一个额外的列,将 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 之前的最小值是“/”,之后的最大值是“:”,所以这应该只提取以数字开头的值:

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;

那仍然可以包含以数字开头的值,但不以数字结尾,这就是我添加 cast(...) > 0 子句的原因,但我认为 mysql 将足够聪明,可以按顺序运行 where 子句,所以希望它只会对以数字字符开头的行子集运行强制转换。

于 2012-04-03T16:04:58.927 回答