数据库索引
Mysql索引数据结构?
顺序查找,二叉树查找,hash索引,二叉树、红黑树,B-Tree,B+Tree:(B-Tree的变种)
01.在创建索引的时候都会考虑哪些因素呢? 什么是联合索引?
对于查询概率比较高,经常作为where条件的字段设置索引。
两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。
02.Mysql的索引顺序(最左匹配),做联合索引多个字段之间顺序你们是如何选择的呢?
识别度最高的字段放到最前面。即符合最左原则。
在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。
1.为什么要用索引?
当一个表中有上千万条数据,如果按名字一行一行去匹配查找,全表扫描,效率会很慢。这时候就需要用索引,相当于给表加了目标和标题,可以缩小查找范围和加快查找速度。
2.什么是索引?
索引是一种数据结构。一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree和Hash索引)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。
建一个索引有什么需要考虑的?
1.表的主键、外键必须有索引;经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;查询中与其他表有关联的字段,例如外键关系;
3.Hash索引的优缺点?
优点:哈系索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针位置。查新name=“jes”这样 的sql效率很快,等值查询的场景更快。
缺点:1.哈希表是无顺的数据结构,假如你想要找出所有小于40岁的员工 就不能用哈希索引。
2.哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
4.B-Tree索引是怎么提升性能?
假设我们在 Employee_Name这一列上创建一个B-Tree索引。这意味着当我们用之前的SQL查找姓名是‘Jesus’的雇员时,不需要再扫描全表。而是用索引查找去查找名字为‘Jesus’的雇员,因为索引已经按照按字母或者数字顺序排序。索引已经排序意 味着查询一个名字会快很多,因为名字少字母为‘J’的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。
5.使用数据库索引会有什么代价?
其一,索引会占用空间 - 你的表越大,索引占用的空间越大。
其二,性能损失(主要值更新操作),当你在表中添加、删除或者更新行数据的时候, 在索引中也会有相同的操作。记住:建立在某列(或多列)索引需要保存该列 最新的数据。基本原则是只如果表中某列在查询过程中使用的非常频繁,那就在该列上创建索引。
6.B+ Tree的叶子节点都可以存哪些东西吗?
InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。
为什么使用B+树作为索引?
比B树更适合作为索引的结构是B+树。MySQL中也是使用B+树作为索引。它是B树的变种,因此是基于B树来改进的。为什么B+树会比B树更加优秀呢?
B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
B+树的关键字全部存放在叶子节点中,非叶子节点用来做索引,而叶子节点中有一个指针指向一下个叶子节点。
做这个优化的目的是为了提高区间访问的性能。而正是这个特性决定了B+树更适合用来存储外部数据。
7.聚簇索引和非聚簇索引 区别?
1.聚簇索引:B+ Tree索引的叶子节点存储了整行数据。
2.非聚簇索引:B+ Tree索引的叶子节点存储了主键的值。
3.聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块。
4.聚簇索引查询会更快。因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询。聚簇索引适合排序,因为聚簇索引本身已经是按照物理顺序放置的,排序很快。
8.为什么聚簇索引查询会更快?
因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询(通常称为回表)。而且,非主键索引不一定会查询多次,通过覆盖索引也可以只查询一次。
9.覆盖索引(covering index):
指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
10.MySQL 5.6新加了什么优化?
1、引入了索引下推优化,默认开启。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。
2.比如:在people表中(zipcode,lastname,firstname)构成一个索:SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
如果没有使用索引下推技术,则MySQL会通过zipcode='95054'从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断数据是否符合条件。 如使 用了索引下推技术,则MYSQL首先会返回符合zipcode='95054'的索引,然后根据lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。 有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。
11.怎么查看索引是否生效?
在select语句前加上explain就可以了。查看sql语句的执行计划,通过执行计划来分析索引使用情况。
如:explain select surname,first_name form a,b where a.id=b.id
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
12.explain 列的解释:
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、 indexhe和ALL
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MYSQL认为必须检查的用来返回请求数据的行数
Extra:关于MYSQL如何解析查询的额外信息。坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
举例: https://blog.csdn.net/Aaroun/article/details/78248509
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南