Nir Asked: 2021-04-05 23:16:41 +0800 CST2021-04-05 23:16:41 +0800 CST 2021-04-05 23:16:41 +0800 CST 按左(col,x)文本列分组-可以索引吗? 772 我正在寻找以下可能的索引: select left(name,10), count(*) from tab group by left(name,10) 这是表配置: create table tab( id int(11), name text, primary key(id), key name(name(10))) 优化器不使用索引进行选择。知道在 MySQL 中是否可行?例如,在 Oracle 中,我可以在函数上创建索引,这在 MySQL 中是不支持的。 mysql mysql-5.7 2 个回答 Voted Best Answer Vérace 2021-04-06T00:28:20+08:002021-04-06T00:28:20+08:00 您可能想尝试这样的事情: create table x ( y varchar (25), z varchar (10) generated always as (left(y, 19)) stored, -- also virtual key (z) ); 或者您可以将索引命名如下(参见此处): CREATE INDEX x_z_ix ON x (z); 我发现为索引提供明确的名称是可取的——它会提供更有意义的错误消息。 仅仅因为有一个索引并不意味着优化器会真正使用它!该表可能太小、太多空值、值倾斜 &c。 我不确定您自己的创建表语法实际上在做什么 - 您能否发布show create table tab\G. Rick James 2021-04-06T08:48:13+08:002021-04-06T08:48:13+08:00 TEXT相对于 有一些缺点VARCHAR(...)。你找到了一个。 如果name是某事物的典型“名称”,那么它可能永远不会超过 100 个字符,也许永远不会超过 40 个字符。我建议在您的应用程序可行的情况下使用合适的而VARCHAR不是。TEXT “前缀”索引是一种组合,可让您对TEXT列进行索引。但是,正如您所发现的,它有一些古怪的限制。是的,有一个“生成的列”解决方法;这也是一个杂项。
您可能想尝试这样的事情:
或者您可以将索引命名如下(参见此处):
我发现为索引提供明确的名称是可取的——它会提供更有意义的错误消息。
仅仅因为有一个索引并不意味着优化器会真正使用它!该表可能太小、太多空值、值倾斜 &c。
我不确定您自己的创建表语法实际上在做什么 - 您能否发布
show create table tab\G
.TEXT
相对于 有一些缺点VARCHAR(...)
。你找到了一个。如果
name
是某事物的典型“名称”,那么它可能永远不会超过 100 个字符,也许永远不会超过 40 个字符。我建议在您的应用程序可行的情况下使用合适的而VARCHAR
不是。TEXT
“前缀”索引是一种组合,可让您对
TEXT
列进行索引。但是,正如您所发现的,它有一些古怪的限制。是的,有一个“生成的列”解决方法;这也是一个杂项。