给产品经理讲技术|天天捣鼓数据库,知道什么是索引吗?

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

数据库说白了就是硬盘上的一个文件,这个文件里面有若干个表,每个表里存了很多条数据。你可以通过一种叫SQL的语言,也就是一些命令,来增加、删除、修改和查询这个文件里存储的数据。


你以为这样就完事了?程序员可不能这么想。程序员写代码,并不是「能用就好」那么简单。数据库设计的好不好,扩展性怎么样,容错性怎么样,都很重要。更多的情况是,你精心设计好了数据库的结构,严格遵守了前辈们总结出来的所有规范,放到线上一跑,悲剧了,速度太慢,产品经理查个数据要等半天,这可怎么是好?


速度慢要怪就怪硬盘。搞IT的应该有个共识,就是离CPU越远的存储设备,速度越慢,先是高速缓存,然后是内存,才是硬盘,还有网络是最慢的。SSD还好一点,普通的机械硬盘,只有几十兆的吞吐量,拷一部电影都要几分钟,拷一堆小文件更是惨不忍睹。扯这么多是想说明什么呢?是说数据库大多数情况下是在查询数据,查询一次数据,就要读取磁盘上的数据库文件,而且是非常频繁的读取,速度问题就是这么来的。


这么说吧,你有一个数据库,存了10万个用户的产品日使用时长,从几分钟到几个小时都有。现在,产品经理想查出使用时长最长的那个用户,他熟练的敲了一行命令(也有可能是熟练的点了某个自动查询的按钮):select max(time) from user_table。


那么,此时计算机在做什么呢?它首先要找到并打开那个有user_table表的数据库文件,然后开始一条一条的读取里面的数据:啊,小花,每天使用2个小时,恩,记下来。全蛋,5分钟,没有小花时间长,扔掉。大宝,10个小时,哇,把小花扔掉。一直等到读完10万条所有的数据,才查到一个(或多个)最大的结果。此时硬盘已经冒烟了。


当然,你也可以用上高科技的方法:数据库索引,情况会大不相同。数据库索引是对数据库里的数据按照某个属性进行排序的一种方式。有两个关键词,某个属性,排序。某个属性是指,索引是跟某个具体的属性挂钩的,比如上面例子里的「用户使用时长」。排序的意思是,尽管你往数据库里插入数据的时候是随便插入的,但是索引会保持「用户使用时长」从小到大或从大的顺序。有了这个顺序,查询就可以用二分法,不用一个一个比对,快多了。


二分法是啥意思?你有没有玩过猜数字的游戏,别人想一个数字,让你猜,猜的时候他说大了还是小了,怎么猜最快?很简单,先猜一个小的,再猜一个大的,然后取中点,再取中点,每次取中点,直到猜中,是最快的。同理,一堆排好序的数字里面找一个数字,比如下面7个数字里面找9,每次都找中间的,依次经过8、12、9,不用比对7次,3次就找到了。这就是二分查找。


上面的例子,如果用索引,应该是这样的。首先对「用户使用时长 」这个属性创建一个索引,一开始是空的,什么都没有。你每次插入一条数据,比如大雄,使用时长37分钟,就把37分钟这个数值放到索引里,并使索引里的所有数值保持从小到大的顺序。经过一段时间,数据库里有了10万条数据,索引里也有了很多排好序的「用户使用时长」。每个时长,还会额外记录它在原来数据库里的对应的位置。为什么?后面解释。


现在你来查询使用时长最长的用户,很简单,找索引的最大值就好了,这个应该是一下子就出来的事情,因为它本来就是从小到大的。或者说你想找「使用半小时」的用户,输入30分钟,在索引里利用前面讲的「二分法」,几下就找到了30分钟这个值,然后呢,根据这个值额外记录的「在数据库中对应位置」的信息,就能顺藤摸瓜从数据库里找到这个用户啦。


以前需要一个一个从硬盘上读取出来比对的,现在排序加二分法,省了很多时间。但是问题也很明显,你应该想到了。创建数据库索引,需要一个额外的磁盘空间,来存放索引。这个也是不小的开支。虽然索引的每一项,只是记录了它的值大小,以及它在原来数据库里的位置,现在数据库都是几千万条数据,开销也不小。


鱼还是熊掌,这就看你怎么衡量了。如果你的数据库,装在一个硬盘空间很大,但是硬盘速度很慢的电脑上,当然可以用索引,空间换取时间,这也是大多数索引的应用场景。如果你的硬盘快满了,或者说查数据的产品经理脾气特别好,等多久都无所谓,那你不用开索引了,随便编个什么「电脑中病毒了,就是卡」之类的故事,搪塞过去就行。


这么说来,程序员跟你说中病毒了,很有可能是他不想给你做优化编出来的呢,一定要警惕啊。


一句话结尾,数据库索引,对数据库里的某个属性的所有值进行排序,从而加快查询速度,是一种典型的空间换时间的思想,请君细细品味。


欢迎添加微信公众号:给 产品经理 讲技术

给产品经理讲技术|天天捣鼓数据库,知道什么是索引吗?

【相关推荐】


给产品经理讲技术丨App开发中,关于图片资源不得不知的秘密

给产品经理讲技术丨究竟什么是渲染?

给产品经理讲技术丨机器配置很好,为什么还是卡?

给产品经理讲技术丨大伙常见的存储设备简介

给产品经理讲技术丨分辨率越高就越清晰吗?


随意打赏

给产品经理讲技术捣鼓捣鼓
提交建议
微信扫一扫,分享给好友吧。