欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一天一个面试题之——索引

程序员文章站 2022-05-06 18:47:33
...
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,可以得到索引的本质:索引是数据结构。

  • 索引的主要目的就是为了提高查询速度

  • 除数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。

其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。

当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。

索引的数据结构:B-、B+、R-、散列

散列实现对直接查找方式能提供最优的性能,但对一定范围的查找却效率底下。

B-树索引实现是一个专门为范围查询设计的

MySQL索引结构有

  • B-Tree索引
  • B+Tree索引
  • 聚簇索引与非聚簇索引
  • full-text全文索引
  • Hash索引
  • R-Tree索引

1 作用

  • 提高查询速度
  • 确保数据的唯一性
  • 可以加速表和表之间的连接,实现表与表之间的参照完整性(外键)
  • 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
  • 全文检索字段进行搜索优化

2 分类

  • 主键索引(PRIMARY KEY)
  • 唯一索引(UNIQUE)
  • 常规索引(INDEX)
  • 全文索引(FULLTEXT)不使用。假设大量的文本检索,可以考虑使用其他数据库产品。

3 常规索引

索引类似数的目录:索引本身也会一张表,索引也会占用空间。

index和key关键字都可设置常规索引
应加在查找条件的字段

  • 不宜添加太多常规索引,影响数据的插入、删除和修改操作
CREATE TABLE  `result` (
	 //省略一些代码
	INDEX/KEY   `ind`  (`studentNo`, `subjectNo`)
)

ALTER TABLE  `result`  ADD  INDEX  `ind`  (`studentNo`, `subjectNo`);

CREATE index ind_name ON 表名(字段名); 

4 唯一索引(UNIQUE INDEX)

唯一索引(UNIQUE)
作用:

  • 避免同一个表中某数据列中的值重复
  • 与主键索引的区别
    • 主键索引只能有一个
    • 唯一索引可有多个
    • 唯一索引可以有一个 null值
    CREATE TABLE  `Grade` (
      `GradeID`  INT(11)  AUTO_INCREMENT  PRIMARY KEY,
      `GradeName`  VARCHAR(32)  NOT NULL  UNIQUE
      #或  UNIQUE  KEY  `GradeID`  (`GradeID`)
      )
    
    

CREATE UNIQUE index ind_name ON 表名(字段名);

创建的是唯一索引,假设里面有数据,那么不能有重复的数据,创建失败。

5 主键索引

某一个属性组能唯一标识一条记录

  • 最常见的索引类型
  • 确保数据记录的唯一性
  • 确定特定数据记录在数据库中的位置
  • 特殊的唯一索引,不能存在null
 CREATE TABLE  `表名` (
	`GradeID`  INT(11)   AUTO_INCREMENT    PRIMARY KEY,
	#或  PRIMARY KEY(`GradeID`)
)

6 索引准则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

7 索引的失效场景(面试会经常问)

  • 1.列类型是字符串,查询条件未加引号。
  • 2.未使用该列作为查询条件
  • 3.使用like时通配符在前
  • 4.在查询条件中使用OR
  • 5.对索引列进行函数运算
  • 6.联合索引ABC问题

8 查看索引是否失效

-- 执行计划:检测当前sql语句各种指标,从而来判断当前这个sql是不是一个合格的sql语句
EXPLAIN SELECT * FROM `hpa_normal_tissue` WHERE id LIKE 'ENSG00000000%'

一天一个面试题之——索引

EXPLAIN:常看的那些字段