MySQL面试 -- 索引

前言概述

最近在找工作,mysql因为是项目主要用到的数据库,但由于平时只注重业务需求,而且数据库操作只停留在表皮上的增删改查,面试时根本不够用。怎么办?没办法啊!! 只能恶补了,不求啥啥都会,但是索引这块必须的要有一个大体的了解。找了很多资料,感觉都是大牛,我就还是选择搬运吧,O(∩_∩)O哈哈~

索引概念

索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。

索引原理

通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

从上面的描述中可以看出索引主要做两件事:排序 + 查找

如何创建索引

1 #方法一:创建表时
 2       CREATE TABLE 表名 (
 3                 字段名1  数据类型 [完整性约束条件…],
 4                 字段名2  数据类型 [完整性约束条件…],
 5                 [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
 6                 [索引名]  (字段名[(长度)]  [ASC |DESC]) 
 7                 );
 8 
 9 
10 #方法二:CREATE在已存在的表上创建索引
11         CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
12                      ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
13 
14 
15 #方法三:ALTER TABLE在已存在的表上创建索引
16         ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
17                              索引名 (字段名[(长度)]  [ASC |DESC]) ;
18                              
19 #删除索引:
20         DROP INDEX 索引名 ON 表名字;

创建索引需要遵循哪些原则

  1. 搜索的索引列,不一定是查询列,最适合创建索引的列是跟在where条件中的列;
  2. 使用唯一索引,列中的数值差异越大越明显,记录性别的字段,只包含两种情况,对其创建索引没有多大用途;
  3. 尽量使用短索引;
  4. 如果数据频繁的更新或删加,就不宜建立索引

什么情况下索引会失效

  1. like '%xx'
    select * from tb1 where email like '%cn';
  2. 使用函数
    select * from tb1 where reverse(email) = 'wupeiqi';
  3. or
    select * from tb1 where nid = 1 or name = 'seven@live.com';
  4. 类型不一致
    如果列是字符串类型,传入条件是必须用引号引起来
    select * from tb1 where email = 999;
  5. 组合索引最左前缀
    如果组合索引为:(name,email)
    name and email -- 使用索引
    name -- 使用索引
    email -- 不使用索引
  6. 没有查询条件,或者查询条件没有建立索引;
  7. 对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)

mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响

普通索引: 允许被索引的数据列包含重复的值。
唯一索引: 唯一索引可以保证数据记录的唯一性。
主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY 来创建。
联合索引:覆盖多个数据列。
正确使用索引可以提高查询效率,但由于建立索引需要占用物理空间,当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。所以建立索引前要考虑。

B+ Tree索引和Hash索引有哪些区别

存储格式上,Hash使用key-value形式;b+tree是多路平衡二叉树。
哈希索引适合等值查询,但是无法进行范围查询
哈希索引没办法利用索引完成排序
哈希索引不支持多列联合索引的最左匹配规则

b+tree的叶子节点都能存什么

直接存放数据的,叫聚簇索引。
存放主键,叫非聚簇索引。

聚簇索引和非聚簇索引区别

1、聚簇索引:
将数据存储与索引放到了一块,找到索引也就找到了数据将数据存储与索引放到了一块,找到索引也就找到了数据。
a) 一个索引项直接对应实际数据记录的存储页,可谓“直达”
b) 主键缺省使用它
c) 索引项的排序和数据行的存储排序完全一致,利用这一点,想修改数据的存储顺序,可以通过改变主键的方法(撤销原有主键,另找也能满足主键要求的一个字段或一组字段,重建主键)
d) 一个表只能有一个聚簇索引(理由:数据一旦存储,顺序只能有一种)

2、非聚簇索引:
将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。
a) 不能“直达”,可能链式地访问多级页表后,才能定位到数据页
b) 一个表可以有多个非聚簇索引

mysql中聚簇索引的设定

聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。

文章引用

https://www.cnblogs.com/Eva-J/articles/10126413.html
他讲的非常全面,我这里只针对面试常问的点做总结,如果要更深入的理解索引,还需要了解很多数据结构,计算机基础方面的知识。我们还很年轻,年轻就得学啊!!

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

推荐阅读更多精彩内容

  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 2,886评论 0 8
  • 说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据...
    爱情小傻蛋阅读 678评论 2 2
  • 一、索引是做什么的? 很多时候,当你的应用程序进行SQL查询速度很慢时,应该想想是否可以建索引。 大多数MySQL...
    wuxiumu阅读 426评论 0 1
  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。比如,InnoDB的聚簇索引使用B+Tree的数据结构存储...
    sherlock_6981阅读 1,859评论 0 2
  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。比如,InnoDB的聚簇索引使用B+Tree的数据结构存储...
    大头8086阅读 17,468评论 7 40