数据库索引相关知识点

参考:
Java技术栈公众号
Cyc

什么是索引?

索引是存储表中一个特定列的值数据结构。B+是大多数 MySQL 存储引擎的默认索引类型。因为不再需要进行全表扫描,只需要对树进行搜索即可,所以查找速度快很多。
因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组。
可以指定多个列作为索引列,多个索引列共同组成键,联合索引。
把数据库索引看作是书的索引

数据库索引是怎样提升性能的?

避免全表扫描,通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。
如B+Tree中,一个节点中的 key 从左到右非递减排列其中的数据是有序的,已经排序意味着查询会快很多。
索引存储了表中相应行的指针可以获取当前行其他列的数据。

数据库索引里究竟存的是什么?

存储了这一列的所有值和指向表中的相应行的指针(指针是指一块内存区域),并不存储其他列的值。
B+树索引:

  • B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。B+ Tree 是基于 B Tree 和叶子节点顺序访问指针(指向下一个叶子节点的指针)进行实现,它具有 B-Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。
  • 叶子节点有顺序访问指针。在每一个Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode的指针信息(增加了顺序访问指针),这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。
  • 每个节点中的关键字是有序的。在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是
    keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。

数据库怎么知道什么时候用了索引?

比如当select from where时,数据库会检查在查询的列上是否有索引.如果确实创建了索引,会接着检查使用这个索引做查询是否合理。

如何使用索引进行查找的?

操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。
B+树的每个节点都是存放在磁盘块上的。每个非叶子节点包含着几个关键字以及指向下一层的指针。

从根节点开始,将所在磁盘块由磁盘载入到内存中,发生一次IO,用二分查找锁定区间,确定指向下一层节点的指针。然后再将下一层节点的磁盘块载入到内存,发生第二次IO,再二分查找…逐层搜索直到找到叶子节点。

(真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。)

如何使用SQL创建索引?

CREATE INDEX name_index
ON Employee (Employee_Name)
联合索引:
CREATE INDEX name_index
ON Employee (Employee_Name, Employee_Age)
查看为表设置的索引:
SHOW INDEX FROM

哈希表索引怎么工作的?

哈希索引。在寻找值时哈希表效率极高。所以使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出值,将列的值作为key,指向该表中相应行的指针作为value
哈希表是无序的。对于查询一个范围的数据不可行。只适合查询键值对。不像B-那么灵活

索引的优点:

1.通过创建唯一索引,可以保证数据库表中每一行的唯一性
2.大大加快数据的检索速度
3.用在外键上,可以加速表和表之间的连接,可别是在实现数据的参考完整性方面
4.使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间(为什么分组时用索引减少时间)
5.通过使用索引,在查询的过程中,使用优化隐藏器,提高系统性能

索引的缺点:

索引会占用空间,表越大,索引占用的空间越大
性能损失:值更新操作时,如增加、删除、跟新行数据的时候,在索引中也会有相同的操作。建立在某列或多列索引需要保存该列最新的数据。
创建和维护索引要耗费时间,这种时间随着数据量的增加而增加
索引需要占物理空间,除了数据表占数据空间外,每一个索引还要占一定的物理空间,如果建立聚集索引,那么需要的空间会更大
当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

使用索引的技巧:

应该使用索引:
1.在经常需要搜索的列上(该列在查询过程中使用的非常频繁)
2.在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
3.在经常需要排序的列上创建索引,因为索引已经排序,加快排序查询时间
4.在经常使用在where子句中的列上创建索引,加快条件的判断速度
5.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
不该创建索引:
1.查询中很少使用或者参考的列(既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。)
2.只有很少数据值的列也不应该增加索引。由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3.对于那些定义为text,image,bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少
4.当修改性能远远大于检索性能时,不能创建索引。修改性能和检索性能是互相矛盾的,当增加索引,会提高检索性能,但会降低修改性能,当减少索引时,会提高修改性能,降低检索性能。
什么情况下设置了索引但无法使用 :
以“%”开头的LIKE语句,模糊匹配
OR语句前后没有同时使用索引
数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)

主键和唯一索引都要求值唯一,但是它们还是有区别的:

①.主键是一种约束,唯一索引是一种索引;
②.一张表只能有一个主键,但可以创建多个唯一索引;
③.主键创建后一定包含一个唯一索引,唯一索引不一定是主键;
④.主键不能为null,唯一索引可以为null;
⑤.主键可以做为外键,唯一索引不行;

聚集索引和非聚集索引的区别:

聚集索引(Innodb):主索引(主键)的叶子节点data域记录着完整的数据记录。一个表只能有一个聚集索引,因为无法把数据行存放在两个不同的地方。索引文件就是数据文件。
非聚集索引(myisam):索引文件存储着指向数据记录的地址。索引文件不是数据文件。

联合索引,最左前缀匹配原则:

首先根据联合索引最左边的、也就是第一个字段进行排序,在第一个字段排序的基础上,再对联合索引中,后面第二个字段进行排序,依次类推。
第一个字段是绝对有序的,从第二个字段开始是无序的,这就解释了为什么直接使用第二个字段进行条件判断用不到索引了(从第二个字段开始,无序,无法走B+Tree索引)
这也就是联合索引中强调最左前缀匹配原则的原因。
特性:
1.对于联合索引,MySQL 会一直向右匹配直到遇到范围查询(> , < ,between,like)就停止匹配。比如 a = 3 and b = 4 and c > 5 and d = 6,如果建立的是(a,b,c,d)这种顺序的索引,那么 d 是用不到索引的,但是如果建立的是 (a,b,d,c)这种顺序的索引的话,那么就没问题,而且 a,b,d 的顺序可以随意调换。
2.= 和 in 可以乱序,比如 a = 3 and b = 4 and c = 5 建立 (a,b,c)索引可以任意顺序。
3.如果建立的索引顺序是 (a,b)那么直接采用 where b = 5 这种查询条件是无法利用到索引的,这一条最能体现最左匹配的特性。

为什么推荐使用自增ID作为主键:

B+树每个节点的关键字是有序的且叶子节点还存储着顺序访问指针。因为B+树的有序性,我们希望保证每次插入时B+树索引都是从右边扩展,避免频繁的合并和分裂,如果使用字符串主键和随即逐渐,会使得数据随即插入,效率低下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
图像识别技术在病虫害检测的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统,可以是移动应用、网页服务或集成到智能农业设备。 7. **实时监测**:在实际应用,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测的应用将广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值