6. 了解过Mysql的索引嘛 ?
MYSQL索引主要有 : 单列索引 , 组合索引 和空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过
单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为
-
普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
-
唯一索引:索引列中的值必须是唯一的,但是允许为空值
-
主键索引:是一种特殊的唯一索引,不允许有空值
-
全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。
组合索引 : 在MYSQL数据库表的多个字段组合上创建的索引 , 称为组合索引也叫联合索引
-
组合索引的使用,需要遵循左前缀原则
-
一般情况下,建议使用组合索引代替单列索引(主键索引除外)
创建索引语法 :
1). 创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name ( index_col_name,... ) ;
2). 查看索引
SHOW INDEX FROM table_name ;
3). 删除索引
DROP INDEX index_name ON table_name ;
7. 索引的底层数据结构了解过嘛 ?
索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引
MyISAM和InnoDB存储引擎:只⽀支持B+ TREE索引, 也就是说默认使用BTREE,不能够更换
MEMORY/HEAP存储引擎:支持HASH和BTREE索引
8. MYSQL支持的存储引擎有哪些, 有什么区别 ?
MYSQL存储引擎有很多, 常用的就二种 : MyISAM 和InnerDB , 者两种存储引擎的区别 ;
-
MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储
-
MyISAM 不支持事务 , InnerDB支持事务
-
MyISAM 不支持外键 , InnerDB支持外键
9. 什么是聚簇索引什么是非聚簇索引 ?
聚簇索引
在使用InnoDB
存储引擎的时候, 主键索引B+树叶子节点会存储数据行记录,简单来说数据和索引在一起存储 , 这就是聚簇索引
非聚簇索引
在使用MyISAM
存储引擎的时候, B+树叶子节点只会存储数据行的指针,简单来说数据和索引不在一起 , 这就是非聚簇索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
需要查询二次
如果使用MyISAM
存储引擎 , 会首先根据索引查询到数据行指针, 再根据指针获取数据
如果是InnoDB
存储引擎 , 会根据索引查找指定数据关联的主键ID , 再根据主键ID去主键索引中查找数据
11. 知道什么是回表查询嘛 ?
当我们为一张表的name
字段建立了索引 , 执行如下查询语句 :
select name,age from user where name='Alice'
那么获取到数据的过程为 :
-
根据
name='Alice'
查找索引树 , 定位到匹配数据的主键值为id=18
-
根据
id=18
到主索引获取数据记录 (回表查询)
先定位主键值,再定位行记录就是所谓的回表查询,它的性能较扫一遍索引树低
12. 知道什么叫覆盖索引嘛 ?
覆盖索引是指只需要在一棵索引树上就能获取SQL所需的所有列数据 , 因为无需回表查询效率更高
实现覆盖索引的常见方法是:将被查询的字段,建立到联合索引里去。
执行如下查询语句 : select name,age from user where name='Alice'
因为要查询 name
和 age
二个字段 , 那么我们可以建立组合索引
create index index_name_age on user(name,age)
那么索引存储结构如下 :
这种情况下, 执行select name,age from user where name='Alice'
, 会先根据name='Alice'
, 找到记录 , 这条记录的索引上刚好又包含了 age 数据 , 直接把 Alice 77
数据返回 , 就不会执行回表查询 , 这就是覆盖索引