数据库索引

先由一个例子来引入索引:

假设有一张表Users,三个字段分别是user_name,user_age,user_sex。
现在要做一个这样的查询:找出表中所有用户名是“cwj”的人。一般会这样写:

select * from Users
where user_name = "cwj"

这样的查询语句,数据库会扫描Users表中的每一行数据来确定user_name是否为“cwj”;而且,我们要查询的是所有名为“cwj”的人,所以在你找到第一个符合条件的人时,查询并不会停止,所以一直要遍历整个表才能实现我们的需求。这就是 全表查询

索引的作用

通过上面例子,应该大体能猜出索引的作用了。我们可能会想,数据库怎么如此笨拙,这样简单的一个查询却要遍历整张表,就像用人眼从头到尾一行一行找一样。当然不是,索引就是数据库解决这类问题的方法。使用索引的全部意义就是通过缩小一张表中的记录/行的数目,来加快搜索的速度!

什么是索引

说了那么多,是时候提出索引的概念了。一个索引是一个数据结构,这个数据结构中存储的是表中一个特定列的值,以及指向这个值所在行的指针。 需要注意的是,索引中并不存储这个列所对应行的其它字段的值,只是有一个指向这个列值所在行的指针,我们通过这个指针就可以找到这条记录的位置了。比如某个结点可能是这样的("cwj", 0x88989),后面这个指针就是这条记录在内存中的地址,如果没有这个指针,你就只能访问到一个单个的列值,这样是没有意义的。拿一个比喻来说,书的目录就像索引,目录每一章节就是键,对应的页码就是值,你想看具体哪一章当然不用翻遍全书,只需要在目录中找到那一章,然后根据对应的页码翻书就行了

索引使用的数据结构

那么什么样的数据结构能够作为索引呢。常用的有B-Tree,哈希索引,R-Tree,位图索引等等。
B-tree 是最常用的用于索引的数据结构,因为它的时间复杂度低,增删改查都可以在对数时间内完成。另外就是存储在B-Tree中的数据是有序的。有关B-tree数据结构的讨论将单独写一篇文章介绍。而像R-Tree以及位图索引不太了解,日后再说

哈希索引

说道哈希索引,就得知道哈希表和哈希算法的概念。哈希表是以键值对的方式存储对象的
存储: 首先对键进行哈希算法生成一个Hashcode,然后在哈希表中根据这个Hashcode找到存储的bucket的位置。注意这个bucket中存储的是键和值都有。然后如果刚好键的Hashcode相等,就称为冲突,解决冲突有很多种方法,最常用的是链表解决法,即将Hashcode相同的数据按照链表的方式存储。

image.png

查找:查找时,先对键进行哈希算法,并根据生成的Hashcode在哈希表中找到相应的值,如果冲突,就按链表依次查找。
Hash索引:原理是一样的,列的值作为键,列所对应的行的地址作为值。
优点:在等式比较的查询中速度非常快,因为不需要遍历整个列的值,而是根据值进行哈希算法得到地址,最多解决一下冲突而已,所以效率大大提升
缺点:既然哈希索引效率这么高,怎么不是数据库最常用的索引方式呢,当然是有局限的

  1. 因为哈希索引比较的是经过Hash计算后的值,所以只能进行等式比较,不能用于范围查询,比如要查个所有小于40岁的员工,这就没办法了。
  2. 虽然哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按顺序排列,所以无法加快任何排序操作的效率
  3. 当哈希值大量重复,也就是冲突特别多时,检索效率会大大降低。
  4. 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
  5. 哈希索引也不能避免表扫描,前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使找到了满足某个 Hash 键值的数据的记录,但这个记录可能是多条,所以也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
数据库中创建索引

一般来说,当SQL(select * from Users where user_name = "cwj")运行时,数据库会检查在查询的列上是否有索引,假设有,数据库会接着检查使用这个索引查询是否合理(因为有些场景下,使用索引比起全表扫描更加低效。
之前的例子中,在user_name列上创建索引的SQL如下:

create index name_index on Users (user_name);

创建联合索引:

create index name_index on Users (user_name, user_age);
数据库索引的代价

当然,事物都有两面性,索引这么好就没有问题吗?当然有

  1. 索引会占用空间,表越大,索引占用的空间就越大
  2. 性能损失, 当在表中进行增删改操作时,在索引中也会有相同的操作,因为建立在某列或多列的索引需要保存该列最新的数据
什么时候使用索引

一般来说,如果表中某列在查询过程中使用的非常频繁,那就在该列上创建索引

文章大部分内容引自http://blog.csdn.net/weiliangliang111/article/details/51333169

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容