我正在尝试MySQL二级索引,引用MySQL文档,然后发生了奇怪的事情。
create table jemp(
c JSON,
g VARCHAR(20) GENERATED ALWAYS AS (c->"$.name"),
INDEX i (g)
)
INSERT INTO jemp (c) VALUES
('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'),
('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}');
%
,但是它可以得到结果。select c->"$.name" as name from jemp where g like "%F%"
%
,索引也起作用了。然而,我没有得到任何结果。根据我对MySQL的拙劣理解,这应该是可行的。select c->"$.name" as name from jemp where g like "F%"
如果有人能帮我的话,我会非常感激的。
发布于 2020-12-14 00:03:52
要使查询正常工作,您需要一个生成的列,该列将名称提取为文本而不是JSON。也就是说,使用->>
而不是->
g VARCHAR(20) GENERATED ALWAYS AS (c ->> '$.name')
然后:指数可能对以下两种情况都有帮助:
where g like 'F%'
where g = 'F'
MySQL是否决定使用它则是另一回事;基本上,数据库评估使用索引是否比全面扫描更快。如果它认为该条件将在大量行上匹配,则可能会选择完全扫描。
请注意,对于字符串文本,我始终使用单引号;尽管MySQL不允许使用单引号,但这是SQL标准所指定的。在其他一些数据库中,双引号代表标识符(这也符合标准)。
https://stackoverflow.com/questions/65281967
复制相似问题