mysql - 使用索引语义确定 MySql 索引列中的字段是否为数字

标签 mysql indexing b-tree query-performance

我有一个 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/

相关文章:

python - 如何使用列作为索引获取 pandas 数据框中某个位置的单元格

python - 附加 xml 文件中的列表列表

java - 多路树可比接口(interface)问题

python - B树 : Is there a difference between different TreeSet incarnations?

mysql - 表数据导入向导 'Could not determine delimiter'

python - 使用 python 字典中的值的新 pandas 数据框列

java - 按升序将数据存储在表中

java - B树和磁盘持久性

mysql - 从答案表中选择行

mysql - 查询改进