首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按左(col,x)文本列分组-可能索引吗?

按左(col,x)文本列分组-可能索引吗?
EN

Database Administration用户
提问于 2021-04-05 07:16:41
回答 2查看 34关注 0票数 1

我正在为以下内容寻找一个可能的索引:

代码语言:javascript
运行
复制
select left(name,10), count(*)
from tab
group by left(name,10)

这是表配置:

代码语言:javascript
运行
复制
create table tab(
id int(11),
name text,
primary key(id),
key name(name(10)))

优化器不对select使用索引。在MySQL中,你知道这是否可能吗?例如,在Oracle中,我可以在函数上创建索引,这在MySQL中是不受支持的。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2021-04-05 08:28:20

您可能想尝试类似于的东西:

代码语言:javascript
运行
复制
create table x 
(
  y varchar (25),
  z varchar (10) generated always as (left(y, 19)) stored, -- also virtual
  key (z) 
);

或者您可以将索引命名如下(请参阅这里):

代码语言:javascript
运行
复制
CREATE INDEX x_z_ix ON x (z);

我发现为索引指定显式名称更好--它提供了更有意义的错误消息。

仅仅因为有一个索引,并不意味着优化器将实际使用它!表可能太小,太多的空值,在值&c中倾斜。

我不太清楚您自己的create语法到底在做什么--您可以发布show create table tab\G的输出吗?

票数 2
EN

Database Administration用户

发布于 2021-04-05 16:48:13

相对于TEXTVARCHAR(...)有一些缺点。你找到了一个。

如果name是某物的典型“名称”,那么它可能永远不会大于100个字符,也许永远不会超过40个字符。我建议在您的应用程序实际可行的时候,使用一个合适的VARCHAR而不是TEXT

“前缀”索引是让您在TEXT列上有一些索引风格的一种假象。然而,正如你所发现的,它有一些奇怪的限制。是的,有一个“生成的列”的解决办法;这也是一个传说。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/289270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档