数据库大家都很熟悉,索性的作用也应该知道就是加速查找的速度。
一般情况下,数据库中表的数据是线性的存放在某种数据结构当中的。
如果没有索引的情况下,将遍历的查找数据表,然后直到找到你要的数据为止。
但是为什么索引可以加速查表得速度呢?
如果使用了索引,会将每行的索引列和数据库的物理地址组合成一个最小单元,表中存在几行就生成几个最小单元,然后用B树的数据结构,将最小单元组织起来。
这样,当你使用索引列进行查表时,将不再需要遍历数据表,而是直接查找B树获得该行在系统中的物理地址,直接返回给用户。
索引是不是越多越好呢?
并不是,索引的存在意味着数据库需要为这张表单独的维护一个B树的数据结构。所以增删改的速度会会变慢,如果给不必要的列增加了索引,那么整体的业务速度会因此而变慢。
索引检索是不是一定可以增加查表的速度呢?
并不是。
数据库的底层原理中,只有B树这一种数据结构去实现索引吗?
并不是,数据库还使用bitmap(位图)的方法去实现索引。
举例:如果一张表有10行,然后存在一个性别的列,取值限定为 F(女) 或者M(男) 或者 S(保密)
bitmap将使用三行一行10个位去维护这个表。
第一行使用1去表示女,0去表示不是女。
第二行使用1去表示男,0去表示不是男。
第三行使用1去表示保密,0去表示不是保密
位图使用一个位去表示某种情况,极大的减少的存储密度,
但是位图仅仅在取值非常有限的情况下适用。
那么索引必须用户自行声明吗?
并不是,大部分的数据库都会自动的将主键primary列维护一个索引数据结构。
同时 unique 唯一键也会维护一个索引数据结构。
所以,一旦你声明了一个列是主键或者唯一键,那么数据库底层将自动为之维护一个索引数据结构去加快查表。