数据库面试时,常问的 Selectivity 和 Cardinality 到底是什么
点击蓝色“有关SQL”关注我哟
加个“星标”,天天与10000人一起快乐成长
让我们举个例子:
假设新学期报道,当你置身于班级中时,你发现大家都穿着同样颜色的衣服,无非男女款式不同,男同学长裤,女同学长裙,但都是黑色。人生地不熟的你,怎么才能确定你们的女班长在哪一堆中间(假设班长是女的,且你还不知道她长什么模样)?
当然,说句废话,只要你就读的中学不是女子中学,或者男子中学,你们班级肯定有男有女。按照性别来归类,总共只有 2 类。这两类就可以被称作 Cardinality = 2.
有人会问,知道 Cardinality = 2, 能找到班长吗?答案自然没那么简单,放在后面讲。这里先铺个垫,让大家对 Cardinality 有个形象的认识。
再来细分下同学的穿着。从服装上已经无法再细分了,大家都是黑色,长裤长裙一半一半。
但从球鞋上,还是能看出花样来。男同学,普遍的阿迪,耐克,特别一些的会穿美金龙,阿瑟士。而女同学们,则花样多了,阿迪,新百伦,斯凯奇,老爹鞋,热风,马丁靴,森马,甚至还有百丽,Coach, Miss Sixty等等。
一圈走下来,细心的你,发现一个统计数据,男同学穿4种鞋,女同学有16种品牌的鞋。按照刚才的算法, Cardinality 就等于 20.
经统计,全班总共有 50 人, 2 种性别的人,穿了 20 种品牌的鞋。
接下来,就是你挑班长的方法了:
按照男女比1:1来,你至少要从 25 个女同学里找到你的班长;
按照品牌的鞋来找,你会发现,只要从 50/20 个人里面找,就可以了。
自然,哪种方法快,就不用言说了。按照穿的鞋来找,最多只要找3个人,一问便知。
这里的依据,便是 50/20, 50/2 , 即 总人数/总分类个数,而 Cardinality 在这里就承担总分类个数的角色,也就是同一类属性中,不同属性值的个数。
将这个公式倒过来,总分类个数/总人数,就是这类属性的 Selectivity. 值越高,表示越多样化,也就越容易找到想要的人;值越低,表示缺乏多样性,精确查找的效率就越低。
可见, Selectivity 可以帮助我们有效评估字段建立索引的价值。
往期精彩: