MySQL索引

mysql索引

1. 索引是什么

索引其实也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

2. 索引的好处:

创建索引可以大大提高系统的性能。

  1. 加快mysql的检索速度,这也是建立索引的主要原因;
  2. 通过创建唯一性索引,可以保证数据库中每条记录的唯一性;
  3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;
  5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

3. 索引的坏处:

  1. 降低更新表的速度,因为对表进行insert、update、delete时,mysql不仅要保存数据,还要更新索引文件;
  2. 建立索引会占用磁盘空间的索引文件,一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。

4. 索引的分类:

  1. 普通索引:分为单列索引和组合索引,单列索引,即一个索引只包含一个列,多列索引,即一个索引包含多个列;

  2. 唯一索引:索引列的值必须唯一,但允许有空值,如果是组合索引,则列值得组合必须唯一;

  3. 主键索引:一个表的主键就是一种特殊的唯一索引,不能有控制,一个表只能有一个主键;

  4. 组合索引:指在多个字段上创建的索引,只有在查询条件中使用了创建组合索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。

    最左前缀:
    定义:最左前缀原则指的的是在sql where 子句中一些条件或表达式中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要 出现非顺序出现、断层都无法利用到多列索引。
    
    举例说明:加入有一个多列索引(username,password,age),当三列在where中出现的顺序如(username,password,age)、 (username,password)、(username)才能用到索引,如下面几个顺序(password,age)、(passwrod)、(age),这三者不 从username开始;(username,age),出现断层,少了password,都无法利用到索引。因为B+tree多列索引保存的顺序是按照索引创建的顺序,检索索引时按照此顺序检索。
    
  5. 全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。

   -- 全文索引查询的例子
   select * from books where match(title,content) against('java');

5. 哪些情况不适合加索引

  1. 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  2. 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
  3. 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
  4. 当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
  5. 如果每次都需要取表的所有记录;
  6. 对于记录比较少的表。

6. 索引的数据结构

InnoDB和MyISAM数据存储引擎中使用B+树来保存索引,但是这两种引擎的实现方式不同。

InnoDB存储引擎支持以下几种索引:

  • B+ 树索引;
  • 全文索引
  • 哈希索引

InnoDB支持的哈希索引是自适应的,会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引。

B+树索引并不能找到一个给定键值得具体行,B+树索引能找到的只是被查找数据行所在的页,然后数据库通过把页读入内存,再在内存中进行查找,最后得到想要查找的数据。

参考:

《MySQL技术内幕》

http://www.runoob.com/mysql/mysql-index.html

https://blog.csdn.net/superit401/article/details/51291603

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

推荐阅读更多精彩内容

  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 2,855评论 0 8
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,777评论 5 116
  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,150评论 0 33
  • 索引是用来快速检索出具有特定值的记录。如果没有索引,数据库就必须从第一条记录开始进行全表扫描,直到找出相关的行。数...
    咕泡学院蓉蓉老师阅读 441评论 0 2
  • 我们发现 , 一般情况下 ,人在做一件事的时候一旦遇到阻挠 , 第二次再去做 ,心里就会有顾虑,甚至会产生动摇。但...
    雨如花飞阅读 945评论 2 9