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

2020-05-26 14:00:10 +08:00
 mlgm2020
刚在网上看到:

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

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

数据库里也是一样,表的索引就是把某些列按照循序排好,单独找个位置存下,每次更新或者新增时候同时要维护下存储的索引,然后查询时候优先从看看查询条件里,有没有能用到的索引列,然后就“跳跃过去快速找数据”
luckyrayyy
2020-05-26 15:47:50 +08:00
不加索引:nickname 就是乱序的,字母 a 后面可能是 z,下一个可能是 d 。你想找 css 得遍历一遍。
加了索引:nickname 是有序的,a 后面 b,b 后面 c,找到 c 再找下一级的 s,岂不是快得多?
daozhihun
2020-05-26 15:51:19 +08:00
mysql 是前缀索引,用 b+数存储,lz 该补补基础了
zxCoder
2020-05-26 15:54:56 +08:00
有索引你就直接跳到 css,没索引你就一行一行看是不是 css

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX