首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

mysql,关于模糊查询百分号放在前面,索引的使用问题,求教!

  •  
  •   Gaussen · 360 天前 · 3219 次点击
    这是一个创建于 360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前有了解到,即使查询条件字段有设置索引,在使用模糊查询的时候,将百分号放在前面,也是无法触发索引的。

    select region from user where name like '%908';

    那如果说,我希望能够这么进行模糊查询,同时还可以使用 name 的索引,可以实现吗?

    22 回复  |  直到 2018-12-15 11:23:51 +08:00
        1
    jybox   360 天前   ♥ 1
    不能实现。
        2
    Gaussen   360 天前
    @jybox 好的,谢谢解答。
        3
    jybox   360 天前   ♥ 4
    你可以把 name 字段倒着存一份,比如存个 rname = nessuaG,然后想查 %ssen 的话就倒着查 rname like ness% 就可以用 rname 上的索引了。
        4
    Gaussen   360 天前
    @jybox 好主意!
        5
    hdonghong   360 天前
    考虑覆盖索引?
        6
    Gaussen   360 天前
    @hdonghong 没有使用过,数据库我懂的比较少。
        7
    nimabibi   360 天前 via iPhone
    请了解 reverse 函数用法
        8
    jadec0der   360 天前
    @nimabibi 你是认真的么。lz 要索引,用 reverse 是想每次查询的时候都计算然后比较么?那还是扫全表啊
        9
    artist   360 天前
    @jadec0der explain 看下呢。
        10
    pain400   360 天前
    @hdonghong 你得先用上索引。。。
        11
    jadec0der   360 天前
    @artist 你们就不能多说两句么? explain 什么?? reverse 函数的什么用法??

    我能想到三个 reverse 的用法:

    1. where reverse(name) like '908%'; 这种肯定是扫全表,比原来还慢

    2. 用 generated column 建索引,跟 3L 的方案本质上是一样的,能少写点代码,但是需要高版本的 MySQL

    3. 直接用 reverse(name) 建索引,据我所知 MySQL 不支持

    所以我认为 reverse 解决不了这个问题,但是我依然想聆听一下 7L 的高见,如果 7L 没有高见,我就要 block 你们这些三词怪了
        12
    jadec0der   360 天前
    @jadec0der typo like '809%';
        13
    dreamans   360 天前
    生产环境的话,还是借助 es 之类的检索服务吧
        14
    Exceptions   360 天前
    @jadec0der 哈哈 ,见多不怪
        15
    nimabibi   360 天前
    @jadec0der create index reverse(field) ,查询 where reverse(field) like (reverse('%value')),我要是你,就先拿着这个 reverse 放到搜索引擎先去查下有没有,而不是自以为是的,在这里无脑喷,什么年代了,搜索不会用了,mysql reverse like 索引优化,不会搜索了?
        16
    Donne   360 天前
    @nimabibi 函数索引是 oracle 吧,MySQL 没找见这种操作。
        17
    atpking   359 天前
    可以取巧的

    就是在做表的时候 直接建立一列 reverse_named_column

    之后在每次存储和修改的时候 及时的算一份, 存在 reverse_named_column 上 (Rails 里是 before_save )

    之后就可以按照之前用户说的 反查了

    当然这种是取巧的方式,


    上 elk 可以本质上解决问题
        18
    jadec0der   359 天前
    @nimabibi 请允许我为我的「自以为是」、「无脑喷」和「不会搜索」道歉,我确实没有搜索到这个用法,请先生教我。

    假设我有一个表:

    CREATE TABLE `docs` (
    `id` int(6) unsigned NOT NULL,
    `content` varchar(200) NOT NULL,
    PRIMARY KEY (`id`)
    ) DEFAULT CHARSET=utf8;

    请问 create index reverse(field) 的语句具体怎么写呢?

    我试了 CREATE INDEX rev_content ON docs(REVERSE(content)); 这样不行呀
        19
    Lwf1995   359 天前
    你可以试试那啥 locate (‘ AAA ’ , table.field) > 0
        20
    nimabibi   359 天前 via Android
        21
    jadec0der   359 天前 via Android
    @nimabibi 哪个版本的 MySQL 支持这种用法? cerate index 索引名称 on 表名(reverse(列名));
        22
    megatron7   359 天前
    right() substr() instr() 试试
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4571 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 06:18 · PVG 14:18 · LAX 22:18 · JFK 01:18
    ♥ Do have faith in what you're doing.