我正在为以下内容寻找一个可能的索引:
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)))
优化器不对select使用索引。在MySQL中,你知道这是否可能吗?例如,在Oracle中,我可以在函数上创建索引,这在MySQL中是不受支持的。
发布于 2021-04-05 08:28:20
您可能想尝试类似于这的东西:
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中倾斜。
我不太清楚您自己的create语法到底在做什么--您可以发布show create table tab\G
的输出吗?
发布于 2021-04-05 16:48:13
相对于TEXT
,VARCHAR(...)
有一些缺点。你找到了一个。
如果name
是某物的典型“名称”,那么它可能永远不会大于100个字符,也许永远不会超过40个字符。我建议在您的应用程序实际可行的时候,使用一个合适的VARCHAR
而不是TEXT
。
“前缀”索引是让您在TEXT
列上有一些索引风格的一种假象。然而,正如你所发现的,它有一些奇怪的限制。是的,有一个“生成的列”的解决办法;这也是一个传说。
https://dba.stackexchange.com/questions/289270
复制相似问题