Mysql之面试题之索引


前言

提示:这里可以添加本文要记录的大概内容:
写这个MySQL的人也是牛逼,这就是一个Excel表格由之前的直接可视化界面操作被改成通过命令操作。

简而言之就是:在数据库系统中,我们考虑的主要构成包括库(数据库)、表、行(记录)、索引这四类对象。每类对象上都可以进行增加、删除、修改、查询等操作。然而,数据库系统设计和优化的重点通常集中在索引的管理、事务的处理以及锁的控制上。这些机制确保了数据库在执行操作时,不仅遵循ACID原则,即原子性、一致性、隔离性、持久性,也保证了数据处理的高效率。在日常应用中,这意味着要把页面中的数据变化高效且安全地同步到数据库


一、索引

简述:一个空间和时间博弈的结果:其实这里有句话:
哪有什么岁月静好,只不过是有人在替你负重前行:
1、想用索引,先得有索引,有索引就得建索引并时实更新索引。
增删改数据的这个过程中就在更新索,这样其实就降低了增删改数据的性能,进而提升了查询的效率:
所以当表的查询相对较少,增删改相对较多时候,索引不建议多建。更具业务情况来
一般公司建立索引为10个:建议使用联合索引

作用:主要作用 (重要)

  • 提升查询性能:这是索引最基本也是最重要的作用,通过将数据索引化来避免全表扫描,从而快速定位到所需的数据。

  • 减少回表操作:在拥有覆盖索引的情况下,查询可以直接在索引中获取所需的所有列的值,无需访问数据表本身,这降低了磁盘I/O操作和查询成本。

  • 提升排序效率:索引本质上是排序的数据结构,当查询包含ORDER BY子句时,索引可以极大加快排序的速度。

  • 辅助锁机制:尤其是在行级锁定中,索引可以帮助数据库更精确地锁定需要修改的记录,避免不必要的锁定扩展,从而提高并发性能。

作用:更细分了没啥用,想看看看(不重要)

  1. 提高查询效率:索引最主要的功能是加速查询操作,类似于书籍的目录,可以快速找到数据的位置而不必全表扫描。

  2. 增强排序和分组速度:当对数据进行排序(ORDER BY)或分组(GROUP BY)操作时,索引可以显著减少数据排序和分组的时间,因为索引中的数据已经是有序的。

  3. 加速表连接:在使用JOIN语句连接多个表时,对参与连接的列创建索引可以提高连接的效率。

  4. 实现数据的唯一性约束:通过在表上创建唯一性索引(UNIQUE INDEX),可以保证列中的数据不出现重复值,从而维护数据的唯一性。

  5. 优化条件过滤:索引可以帮助数据库更快地筛选满足特定条件的记录,尤其当这些条件针对索引列时。

  6. 辅助计算:在一些数据库引擎中,如InnoDB,索引可以用来直接完成一些COUNT()、MIN()和MAX()等聚合函数的快速计算,因为索引存储的是有序数据。

  7. 减少I/O成本:读取索引通常比读取整个表消耗的I/O要少,特别是在索引能够被覆盖的查询中,数据库可以只读取索引而避免读取数据行,减少了磁盘I/O操作。

  8. 改善锁性能:对于支持行级锁的存储引擎(如 InnoDB),索引可以减少锁定需要的行数目,从而提高并发访问性能。

简言之,索引是MySQL提高数据库性能和维护数据完整性的重要工具。不过,也要注意索引不是万能的,不恰当的索引会额外增加更新、删除和插入操作的开销,占用更多存储空间,并且可能对数据库性能产生负面影响。因此,如何根据应用场景合理设计和使用索引是数据库优化的重要方面。

索引分类:有兴趣就看看没兴趣就直接跳过(不重要)

提示:索引可以按照不同的维度被分类,包括按照数据结构、按照功能等来进行分类

功能分类

1、主键索引(PRIMARY KEY):

  • 用于唯一标识表中的每一行,并且不允许NULL值。
  • 每个表只能有一个主键索引。
  • InnoDB存储引擎中的主键索引也是聚簇索引,数据实际存储在主键索引的叶子节点上。
  • 使用场景:用于快速查找或排序基于主键的记录,外键关联等。

2、唯一索引(UNIQUE INDEX):

  • 确保某列(或多列组合)的值唯一。
  • 允许有空值,但空值只能有一个。
  • 使用场景:主要用于实施业务层面的数据唯一性,如用户邮箱、身份证号码等。

3、普通索引(INDEX):

  • 基础的索引类型,没有任何约束。
  • 使用场景:加快对数据的检索速度,适用于常作为查询条件的列。

4、全文索引(FULLTEXT INDEX):

  • 专门用于全文搜索,支持非精确匹配上的文本搜索,如MATCH AGAINST查询。
  • 在InnoDB和MyISAM存储引擎上可用。
  • 使用场景:常用于文本数据的搜索引擎功能,如搜索文章、评论等。

5、空间索引(SPATIAL INDEX):

  • 用于地理数据存储,基于R-Tree数据结构。
  • 仅MyISAM存储引擎支持。
  • 使用场景:使用地理数据类型的列,如GIS地理位置查询。

7、索引前缀(PREFIX INDEX):

  • 对文本类型列只索引开始的部分字符。
  • 使用场景:适用于长文本字段,能够节省索引空间,提高索引效率。

8、复合索引(COMPOSITE INDEX):

  • 基于多个列构建的索引,可以覆盖多个列。
  • MySQL在查询时可以利用组合索引的最左前缀规则。
  • 使用场景:适合跨多个列进行查询的场景。

9、单一索引(SINGLE-COLUMN INDEX):

  • 指基于单一列构建的索引。
  • 使用场景:适用于只涉及单一列的查询优化。

特殊说明:

  • Clustered与Nonclustered:这是索引的另一种分类方式。聚簇索引(如InnoDB的主键索引)中数据记录就存放在索引结构中,而非聚簇索引(如主键索引以外的其他索引)则不是。

  • 锁定策略:某些索引如通过主键或唯一索引的搜索,可能对性能有更好的优化,尤其是在并发事务多的场景中,主键查找通常拥有更优的锁定性能。

  • 选择合适的索引列:创建索引时需要考虑查询模式,选择性高的列(即列中不重复值多的列)作为索引通常更有效。

总而言之,正确使用索引可以大幅提升数据库性能。但是,索引不是免费的午餐,它们在写操作时会带来额外的开销,因为索引本身也需要更新。因此,设计索引应该根据应用的查询模式,避免过度索引,使得维护成本和性能损耗最小化。

结构分类(不重要)

1、B+Tree索引:(重要)

描述:

B+Tree索引是最常见的索引类型,它是MySQL中默认的索引类型,用于InnoDB和MyISAM等存储引擎。

使用场景:

  • 等值查询:非常适合查找单个值。
  • 范围查询:由于B+树的有序性,可以快速定位范围的起始位置。
  • 排序与分组:对于ORDER BY和GROUP BY操作,B+树可以利用索引顺序快速完成。
  • 联合索引的最左前缀优化:对于复合索引,可以根据索引列的左边起第一个字段进行查询优化。

特殊说明:

  • B+Tree索引更适用于需要频繁进行读操作的场景。
  • 由于其排序特性,B+Tree索引在处理ORDER BY和GROUP BY子句时特别有效。
2、HASH索引:

描述:

HASH索引基于哈希表实现,只能满足“等值查询”的快速查找,不支持范围查询。

使用场景:

  • 适用于快速查找的场景,尤其是对于精确匹配查询。
  • 在内存数据库(如MEMORY表)中使用效果更佳。

特殊说明:

  • HASH索引用于精确查找,不适用于查找范围内的记录。
  • MYSQL的HASH索引是适应性的,当冲突增多时倾向于通过链表方式解决。
MySQL索引数据库优化中的核心部分,尤其在面试中经常被问及。以下是常见的面试题及答案解析: ### 1. MySQL索引的基本概念是什么? 索引是一种数据结构,用于快速查找和访问数据库表中的特定信息。通过索引数据库系统可以避免扫描整个表来获取所需的数据[^1]。索引类似于书籍的目录,可以显著提高数据检索的速度。 ### 2. 索引的优缺点是什么? **优点**: - 提高数据检索速度,特别是在大型表中。 - 对表中的数据进行排序,减少排序的时间。 - 加速表连接操作,如JOIN查询。 **缺点**: - 占用额外的磁盘空间。 - 降低插入、更新和删除操作的速度,因为每次修改数据都需要更新索引。 - 增加了数据库的复杂性,尤其是在维护索引时需要额外的资源。 ### 3. MySQL支持哪些类型的索引MySQL支持以下几种常见的索引类型: - **B-Tree索引**:默认的索引类型,适用于大多数场景,支持全值匹配和范围查询。 - **Hash索引**:仅适用于内存表(如MEMORY引擎),适用于等值查询,不支持范围查询。 - **全文索引**:用于全文搜索,适用于文本类型的列。 - **空间索引**:用于地理空间数据类型,如GEOMETRY、POINT等。 ### 4. 如何创建索引?可以举例说明吗? 可以使用`CREATE INDEX`语句为表添加索引。例如: ```sql CREATE INDEX idx_name ON users(name); ``` 此外,也可以在创建表时定义索引: ```sql CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), INDEX idx_name (name) ); ``` ### 5. 什么是联合索引?如何优化联合索引的使用? 联合索引是基于多个列的索引,例如: ```sql CREATE INDEX idx_name_age ON users(name, age); ``` 优化联合索引的使用时,需要遵循**最左前缀原则**,即查询条件必须包含索引的最左列,才能有效利用索引。例如,查询`WHERE name='John' AND age=30`会使用索引,而`WHERE age=30`则不会使用该联合索引。 ### 6. 什么是覆盖索引?为什么它对性能优化有帮助? 覆盖索引是指查询所需的所有字段都包含在索引中,这样数据库可以直接从索引中获取数据,而无需回表查询数据行。覆盖索引减少了磁盘I/O操作,从而显著提高查询性能。例如: ```sql SELECT name FROM users WHERE name LIKE 'J%'; ``` 如果存在索引`idx_name`,则可以直接通过索引获取数据。 ### 7. 什么是索引下推(Index Condition Pushdown)? 索引下推是MySQL 5.6引入的一种优化技术,允许在存储引擎层直接过滤不符合条件的数据,而不是在服务器层进行过滤。这种优化减少了不必要的数据访问,提高了查询效率。例如,在查询`WHERE name='John' AND age>30`时,如果存在联合索引`(name, age)`,存储引擎可以在索引中直接过滤`age>30`的条件。 ### 8. 如何查看索引的使用情况? 可以使用`EXPLAIN`语句分析查询执行计划,以查看索引的使用情况。例如: ```sql EXPLAIN SELECT * FROM users WHERE name='John'; ``` 在输出中,`key`列会显示实际使用的索引,而`type`列显示了索引的使用类型(如`ref`、`range`等)。 ### 9. 什么情况下索引会失效? 以下情况可能导致索引失效: - 使用`OR`连接条件时,可能导致索引失效。 - 在查询条件中对字段进行函数操作,如`WHERE YEAR(create_time)=2023`。 - 使用`LIKE`查询时,以通配符开头,如`LIKE '%abc'`。 - 查询条件中没有使用联合索引的最左列。 ### 10. 如何选择合适的列创建索引? 选择合适的列创建索引时,可以遵循以下原则: - 高选择性的列(即唯一值较多的列)更适合创建索引。 - 经常用于查询条件的列应优先考虑。 - 对于频繁排序或分组的列,创建索引可以提高性能。 - 避免对频繁更新的列创建索引,以减少维护成本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值