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 = '[email protected]';
  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
他讲的非常全面,我这里只针对面试常问的点做总结,如果要更深入的理解索引,还需要了解很多数据结构,计算机基础方面的知识。我们还很年轻,年轻就得学啊!!

你可能感兴趣的:(MySQL面试 -- 索引)