V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
brader
V2EX  ›  MySQL

mysql 哈希索引

  •  2
     
  •   brader · 2020-07-03 09:22:29 +08:00 · 2544 次点击
    这是一个创建于 1364 天前的主题,其中的信息可能已经有所发展或是发生改变。

    你们在实际工作中,哈希索引用的多吗? 这么多年来,我在实际项目中,哈希索引一次都没用过,不知道是自己对哈希索引的认知度不高,还是使用场景本来就少。

    我能想到的使用场景,就是类似 url 这样的字段,都是等值查询的,但是我做过的项目中,很少以 url 字段作为 where 条件的,所以也就不会给这样的字段建立索引。 还有一部分,虽然有等值查询的场景,但是偶尔有业务会用到模糊匹配,所以也放弃了哈希索引,改用普通索引。

    16 条回复    2020-07-03 15:22:16 +08:00
    marquina
        1
    marquina  
       2020-07-03 09:23:52 +08:00 via Android
    InnoDB 有自适应哈希索引啊
    brader
        2
    brader  
    OP
       2020-07-03 09:27:36 +08:00
    @marquina 是有自适应哈希,但是和你单独建的哈希索引,用起来肯定是有区别的,如果完全没区别,mysql 也就没必要保留这个索引类型了。
    gz911122
        3
    gz911122  
       2020-07-03 09:45:12 +08:00
    @brader 为什么肯定有区别啊?
    brader
        4
    brader  
    OP
       2020-07-03 10:08:50 +08:00
    @gz911122 自适应的,例如:某些情况不会建,获取有时候建了,查询的时候不一定会用
    zc1249274251
        5
    zc1249274251  
       2020-07-03 10:22:03 +08:00
    现在 mysql 引擎基本都是 InnoDB,所以接触 hash 索引就很少了 平常使用 mysql 基本就是关系 ACID 也确实用不到 hash 索引一般是用在搜索上这块儿 如果有做搜索引擎的老哥 估计了解得多
    brader
        6
    brader  
    OP
       2020-07-03 10:34:30 +08:00
    @zc1249274251 做搜索引擎业务的,也很少用 mysql 数据库吧,可能是用 ES 之类的?
    souco
        7
    souco  
       2020-07-03 10:43:27 +08:00
    我记得 innoDB 只是支持自适应 hash 索引,创建索引的话只支持 btree ?
    csl1995
        8
    csl1995  
       2020-07-03 11:10:41 +08:00
    基本不会用到的,正常业务都会有范围查询的,哈希只能做等值,所以基本都是用默认的 B+Tree
    chihiro2014
        9
    chihiro2014  
       2020-07-03 11:11:38 +08:00
    不能说没有用吧,只是 hash 索引用的范围较小,只适合精准查询(比如用=这种),不适合范围查询。如果只是确定的东西,使用 hash 索引是最快的,不然要么就循序扫描。MySQL 的话默认 B+Tree 。一般 hash 索引如果 gg,那就会退化为循序扫描了,说的不一定对,看看就好
    hangszhang
        10
    hangszhang  
       2020-07-03 11:36:22 +08:00
    自己创建不了 hash 索引吧,只能 InnoDB 自己去创建
    Kakajing
        11
    Kakajing  
       2020-07-03 11:40:51 +08:00
    @hangszhang 可以创建,为啥不可以???
    slipper
        12
    slipper  
       2020-07-03 11:46:25 +08:00
    因为 B+树的树高很低+顺序读盘,像你这种需求用前缀索引,哪怕几百万条,查询的时间消耗同哈希索引多消耗的时间消耗是微秒甚至 ns 级别,因为无论哪个索引都要读盘,差距的只是传送时间。而网络消耗都是毫秒以上,这样一比较,哈希索引几乎没有时间上的优势了。如果你业务上真的有用哈希比用 B+有明显时间差的话,建议还是不用 innoDB 了。
    v2exblog
        13
    v2exblog  
       2020-07-03 11:54:23 +08:00
    如果你只有一个 mysql,但是还想有缓存的效果,哈希索引就有用了。有钱当然可以上 redis,没钱,哈希索引也还好
    love
        14
    love  
       2020-07-03 13:46:36 +08:00
    @Kakajing 我记得似乎只有内存表有 hash 索引啊?谁用 mysql 内存表啊?
    brader
        15
    brader  
    OP
       2020-07-03 15:02:26 +08:00
    @love 嗯,mysql 只有 MEMORY 引擎显式地支持 hash 索引,不能说没人用吧,有些业务可能会用到
    npe
        16
    npe  
       2020-07-03 15:22:16 +08:00
    InnoDB 在 8.0 移除了 Hash 索引。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3250 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:17 · PVG 22:17 · LAX 07:17 · JFK 10:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.