第二节:看得见的行和列,看不见的索引,看错的分组
如下图所示,你能说出这个表是由行组成还是由分组组成的吗?估计很多人看到这个问题会一脸茫然,心想着:怎么还会有行和分组之说呢?大多数人想当然的会认为都是这些都是数据的行记录而已。请细想一下,我们通常查询出来的结果集(数据表),有可能是一行一行的真实的数据记录,还有可能是若干个行聚合到一起形成的分组。行和分组的展示效果,对我们而言,都是一样的。但是,我们从内心深处要有行和分组的区别,这对我们灵活的使用SQL很有帮助。笔者认为:知识写在书本上对于大家都是一样的,所不同的是每个人的悟性各异,思考出来的东西也不一样,多挖掘多琢磨,看到不一样的东西对技术的提升非常帮助。
在数据库里面,一行数据和一列数据都能被人所感知,并且一行记录往往还带有一个主键,而一列数据,不仅有列名,还有列的类型。
在人生中,看的见的东西很重要,但是看不见的东西也同样重要,甚至看错的东西更重要。这个人生哲理放在数据库里面,同样成立。
1、全表扫描
没有对比就没有伤害,全表扫描对比一下有索引的二分法,你会有更加深刻的影响。下文将引述之前的文字:
不采用任何措施的话,看似简单的查找,往往都是全表扫描,速度那可真是龟速。也许你觉得这是危言耸听,感觉无所谓,自认为当前的CPU十分的强悍,抱着一切无所谓的态度。看看下面一组数据的对比,让你对龟速有个直观的体验吧:
在一个10000条记录的数据表中,查找一次平均需要5000次比较,而在使用了索引的表中只需要14次。
看到了吧,这是10000对14的对比,这就是龟速的体现。
2、索引虽然看不见,但是其影响无处不在
虽然索引看不见,摸不着,但是它能极大的提升查询速度。虽然索引可以提高数据查询的速度,但是任何事物都是双刃剑,它也有一些缺点:
(1)索引占据一定磁盘空间,就像有按笔画查找的目录的书会比没有这种目录的书页数要多一些一样。
(2)索引减慢了数据插入和删除的速度。因为每次插入和删除时都需要更新索引,一个表拥有的索引越多,写操作时的平均性能下降就越大。
3、看错的分组
人人常常将分组当做行,但是它并不是行。行是物理存在的,而分组却是逻辑存在的。对于由行组成的数据集,可以通过where来过滤,但是对于分组的数据集,只能通过having来过滤。分组,一个很重要的概念,后面将是一个单独的知识点,敬请查看下文。