MySQL索引类型

面试时曾经被问了mysql的索引类型,我这个宝批龙给达到数据存储方式上了,聚集索引、二级索引、覆盖索引,也慢慢对面试有了感觉,面试可能会给你一个情景,然后深入问里面的知识点

MySQL有多种索引类型,索引是在存储引擎中实现的,不同的存储引擎对同一个索引类型的实现方式不同,不同的存储引擎支持不同的索引类型

(一)B-Tree索引
InnoDB、NDB、MyISAM、Memory都支持B-Tree索引
InnoDB的默认索引类型为B-Tree索引,其底层的数据结构为B+Tree
NDB底层的数据结构为T-Tree
MyISAM、Memory底层的数据结构为B-Tree
B-Tree索引能加快访问数据的速度,因为存储引擎不在需要进行全表扫描。而是从根节点开始遍历,通过比较节点页的值和要查找的值来找到合适的指针进入下层子节点。能进行这样查找的原因是B-Tree对索引列是顺序组织存储的
叶子节点中保存了指向了被索引数据的指针(索引段吧),指针指向数据段
InnoDB存储引擎中,B+Tree索引类型可以分为聚集索引和二级索引
聚集索引和二级索引的唯一区别:叶子节点是否保存所有数据
二级索引叶子节点存放的数据:index + primary
聚集索引会根据每张表的主键构造一棵B+Tree,叶子节点保存所有的数据
(二)哈希索引
对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
只有Memory显示支持哈希索引,并且是支持非唯一哈希索引的,如果多个列的哈希值相同,索引会以链表的方式存放在多个记录指针到同一个哈希条目中,这个和hashmap中处理哈希冲突的方式有点相同。
注:在哈希表中是根据哈希码值的大小进行排序的,而不是根据存储的顺序进行排序的,所以将无法用于排序
哈希索引的缺点:
上面的也是哈希索引的一个缺点
1)哈希索引值只包含哈希值和行指针,不存储字段值,无法避免读取行,当找到所在行以后,会对值进行一个比较,这在产生多个相同哈希值的时候是非常有必要的
2)不支持部分索引列匹配查找
3)只支持等值查找(如in、()、=、<=>),而不支持范围查找
4) 产生哈希冲突时,查找效率偏慢,并且维护成本很高
InnoDB有一个特殊的功能叫做自适应哈希索引。当InnoDB注意到某些索引值被使用非常频繁时,它会在内存中基于B-Tree索引之上在创建一个哈希索引。这样将加快查询速度,因为减少了遍历
(三)全文索引
查找的是文本中的关键字,而不是直接比较索引中的值。全文索引更类似于搜索引擎做的事,而不是简单的where条件匹配
MyISAM、InnoDB存储引擎支持全文索引
全文索引支持char、varchar、text、自然语言搜索、布尔搜索
为什么需要有全文索引,因为如果使用B-Tree索引,用like '%%'做范围查找时,将不能使用索引进行查找,数据量大的时候查找效率将特别慢(仅是自己的理解)
这里以mysql官网中的sakila数据库进行演示:

mysql> show create table actor\G
*************************** 1. row ***************************
       Table: actor
Create Table: CREATE TABLE `actor` (
  `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`actor_id`),
  KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8

last_name为索引
对last_name进行一个范围查找

mysql> explain select * from actor where last_name like '%S'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: actor
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 200
     filtered: 11.11
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

进行全表扫描查找

使用全文索引,新建了一张数据表

mysql> show create table news\G
*************************** 1. row ***************************
       Table: news
Create Table: CREATE TABLE `news` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `content` (`content`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

在content建立了全文索引
查询语句:

mysql> explain select id from news where match (content) against ('江歌')\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: news
   partitions: NULL
         type: fulltext
possible_keys: content
          key: content
      key_len: 0
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using where; Ft_hints: sorted
1 row in set, 1 warning (0.03 sec)

使用全文索引的查询语句和普通索引的查询不同
格式为select * from table_name wherematch('index_name') against ('搜索值')
从sql执行情况中看,使用上了索引

(四)空间数据索引
MyISAM支持

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

推荐阅读更多精彩内容