mysql索引的面试题

部署运行你感兴趣的模型镜像

1.可以使用多少列创建索引?

任何标准表最多可以创建16个索引列。

2.索引的底层实现原理和优化

B+树,经过优化的B+树

主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。

3. 什么情况下设置了索引但无法使用 

1.以“%”开头的LIKE语句,模糊匹配

2. OR语句前后没有同时使用索引

3. 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)

4.简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

 

普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。

 

主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。

索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。

 

索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

 

5.对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:

1.索引的目的是什么?
快速访问数据表中的特定信息,提高检索速度
创建唯一性索引,保证数据库表中每一行数据的唯一性。
加速表和表之间的连接

使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

2.索引对数据库系统的负面影响是什么?
负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

3.为数据表建立索引的原则有哪些?
在最频繁使用的、用以缩小查询范围的字段上建立索引。

在频繁使用的、需要排序的字段上建立索引

4.什么情况下不宜建立索引?
对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。

对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等

6.主键、外键和索引的区别?

主键、外键和索引的区别

定义:

 主键–唯一标识一条记录,不能有重复的,不允许为空

 外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值

 索引–该字段没有重复值,但可以有一个空值

作用:

 主键–用来保证数据完整性

 外键–用来和其他表建立联系用的

 索引–是提高查询排序的速度

个数:

 主键–主键只能有一个

 外键–一个表可以有多个外键

 索引–一个表可以有多个唯一索引

7.你怎么看到为表格定义的所有索引?

 

索引是通过以下方式为表格定义的:

SHOW INDEX FROM
<tablename>;

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

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、付费专栏及课程。

余额充值