V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mlgm2020
V2EX  ›  问与答

为什么加数据库索引搜索快?

  •  
  •   mlgm2020 · 2020-05-26 14:00:10 +08:00 · 1250 次点击
    这是一个创建于 1423 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚在网上看到:

    [首先:先假设有一张表,表的数据有 10W 条数据,其中有一条数据是 nickname='css',如果要拿这条数据的话需要些的 sql 是 SELECT * FROM award WHERE nickname = 'css'
    一般情况下,在没有建立索引的时候,mysql 需要扫描全表及扫描 10W 条数据找这条数据,如果我在 nickname 上建立索引,那么 mysql 只需要扫描一行数据及为我们找到这条 nickname='css'的数据,是不是感觉性能提升了好多咧....]

    没理解。。WHERE nickname = 'css' 不是本来就搜索 nickname 这一列吗, 不知道加上索引有什么变化
    6 条回复    2020-05-26 15:54:56 +08:00
    cvl
        1
    cvl  
       2020-05-26 14:49:39 +08:00
    想一下一本书,目录得作用
    lkyier
        2
    lkyier  
       2020-05-26 15:24:17 +08:00
    数据库底层存储的大多是 tuple (元组),对于 where 子句,需要遍历每一个元组来寻找数据,而建立索引就是为了减少遍历带来的性能损失。你可以搜下这两篇文章:
    数据库内核杂谈(二):存储“演化论”,
    数据库内核杂谈(三):索引优化,
    opengps
        3
    opengps  
       2020-05-26 15:43:07 +08:00
    索引这个词,想想书的索引就很明确了,书本的索引是对标题进行排序,找的时候可以根据排序规律跳跃快速查找

    数据库里也是一样,表的索引就是把某些列按照循序排好,单独找个位置存下,每次更新或者新增时候同时要维护下存储的索引,然后查询时候优先从看看查询条件里,有没有能用到的索引列,然后就“跳跃过去快速找数据”
    luckyrayyy
        4
    luckyrayyy  
       2020-05-26 15:47:50 +08:00   ❤️ 1
    不加索引:nickname 就是乱序的,字母 a 后面可能是 z,下一个可能是 d 。你想找 css 得遍历一遍。
    加了索引:nickname 是有序的,a 后面 b,b 后面 c,找到 c 再找下一级的 s,岂不是快得多?
    daozhihun
        5
    daozhihun  
       2020-05-26 15:51:19 +08:00
    mysql 是前缀索引,用 b+数存储,lz 该补补基础了
    zxCoder
        6
    zxCoder  
       2020-05-26 15:54:56 +08:00   ❤️ 1
    有索引你就直接跳到 css,没索引你就一行一行看是不是 css
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4798 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:37 · PVG 13:37 · LAX 22:37 · JFK 01:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.