从索引技术谈数据库查询索引建立和查询条件书写

数据库查询优化策略 数据库查询优化策略 1.合理使用索引 数据库服务器对数据进行访问一般采用下面的两种方式:①索引扫面,通过索引访问数据;②表扫描,读表中的所有页。 当对一个表进行查询时,如果返回的行数占全表总行数的10%到15%时,使用索引可以极大的优化查询性能。但是如果查询涉及到全表40%以上的行时,表扫描的效率比使用索引扫描的效率高。 使用索引的通用规则: 1.在经常用作过滤器或者查询频率较高字段上建立索引; 2.在 SQL语句中经常进行GROUP BY、ORDER BY的字段上建立索引; 3.在不同值较少的字段 上不必 阅读详情

索引的优势当然是提高检索速度,但并不是说数据库建立了索引就真的会提高检索速度.为什么呢?

我们知道,索引本身是有序的,索引查找的时候一般是多分查找,(当然在内存用数组实现的索引则可以做到随机查找,但数据库一般很少会采用这种方式组织,一般都是利用B+树),所以索引的查找一般不会是常数级,由于索引本身数据量问题,也不是一次就能将所有索引数据加载在内存里,所以也可能会引起多次磁盘读,加上定位到目标索引后还需要常数级的具体数据块磁盘读写,因此一次索引定位需要的磁盘读写可以控制在常数级别.因此索引查找的速度会在对数级别.但这并不等同于数据库查询时具体的查询速度,下面来分析一下:

1)只有建立索引的字段作为条件才会启用索引查询,提高速度;
2)如果索引字段的条件和其它非索引字段的条件是or关系,也会启用索引,但不会提高速度,因为这是的检索速度取决于慢条件;
3)索引字段在等值查询时效率最高(等条件),大于,小于等带范围的查询条件的速度是否能提高要看数据库索引本身的实现技术,因此数据库一般也不会采用B树而采用类似B+树的原因,因为B+树的卫星数据都在叶子节点上,可以实现范围读,提高范围查询的效率;
4)对于模糊查询,要看具体的数据库,一般是不会启用索引(Oracle 会做一定的优化,会用索引,具体可看后面的测试数据);
5)IS NULL,IS NOT NUL等条件也是一样.

因此,在数据库索引实际应用时要根据实际需要进行:
1)如果某个字段,或者某几个字段频繁单独作为条件查询时,可以建立索引;
2)如果一般字段多使用模糊查询,则不要建立索引;
3)索引字段条件和非索引字段只有在逻辑关系为与的情况下,索引字段条件才会真正有意义,否则还是全表扫描;

下面是Oracle的索引是否有效的一些条件:
1) 一般比较都会启用索引,In,between也会启用索引.
2)Like比较特殊,实际上Oracle会对第1个模糊匹配符号前面的部分串作索引定位匹配,具体的可参见后面的测试数据;
3) is null,is not null不会启用索引;
4)索引字段与常量表达式时Or关系时,常量表达式不会影响结果,但变量和参数化就会全表扫描;

下面是我测试的结果:数据量进2亿,服务器就是普通的PC机,Cards字段是索引字段,batchno字段是非索引字段,下面是结果:

select count(*) from cards;-- >52s
select count(1) from cards;-- >52s
select * from cards where cards='1';--不存在,毫秒
select * from cards where cards='994595942';--存在,毫秒级
select * from cards where cards>='999999999';--毫秒级,但也与返回数据量大小有关.索引有效.
select * from cards where cards>='9999' and  cards<='9999';--毫秒级,但也与返回数据量大小有关.索引有效.
select * from cards where cards in('994595942','999906236');--毫秒秒,索引有效.
select * from cards where cards in( select '994595942' from dual);--毫秒级索引有效.
select * from cards where cards in('999906236');--0.156秒,索引有效.

select * from cards where cards > '999999999';--毫秒级,索引有效.
select * from cards where cards like '999999%';-->毫秒级,索引有效.但也与返回数据量大小有关
select * from cards where cards like '_999999_';--分钟级,索引无效
select * from cards where cards like '999999_';--毫秒级,索引有效.但也与返回数据量大小有关
select * from cards where cards like '_999999';--分钟级索引无效
select * from cards where cards like '999_999';--分钟级索引无效

select * from cards where cards is null;--分钟级索引无效
select * from cards where cards='994595942' or 1>1;--毫秒级,索引有效
update cards set batchno=batchno  where cards='994595942';--毫秒级,索引有效.
update cards set batchno=batchno  where cards='994595942' or i>1;--分钟级索引无效 i是变量
update cards set batchno=batchno  where cards='994595942' or :V >1;--分钟级索引无效 v是占位符号,其实就是一般参数化查询.

select * from cards where cards between '994595942' and '994595942';--毫秒级索引有效.
select * from cards where cards='994595942' or batchno='222';--索引有效,但没意义,还是全表扫描;
select * from cards where cards='994595942' and batchno='222';--索引有效,毫秒级
select * from cards where  batchno='222' and cards='994595942';--索引有效,毫秒级,说明Oracle有先进行索引字段处理的优化.


select * from cards where (batchno,cards) in (select '994595942','994595942' from dual);--毫秒级,索引有效.

PS:从上面的测试来看,Oracle的优化,特别是Like的优化非常到位,因为我原来还认为数据库不会对模糊查询利用索引.当然从上述测试也可以反推出一些Oracle索引存放的一些技术。

 

 

如何优化数据库中数据的查询之建立索引 资源名称:如何优化数据库中数据的查询之建立索引 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。 立即下载

相关推荐

SAP产品合规(Product Compliance)管理—规格主数据 CG02/CG02WB

SAP产品合规(Product Compliance)管理—规格主数据概览 CG02/CG02WB

Lucas1211的博客 1430

mysql优化-索引选择及查询条件优化

随着项目的运行,数据量的累加,系统就会变得越来越慢,优化成为必然。主流的优化方式有开源、节流,开源为调整服务器配置,节流为提升系统的运行效率。其中mysql的查询占有较高的时间复杂度,以下会介绍mysql的优化方法。 优化原则: 1、面向相应时间 指在一定的工作负载下尽可能的降低相应时间 2、定位时间用在什么地方并进行优化 优化思路: 优化方式: 一、数据类型优化 #to be continue ...

u014043168的博客 748

Cluster Computing投稿

在overleaf中新建picins.sty文件,该文件是导入的包在.tex文件中添加以下内容\usepackage{picins}%实现作者简介%下边这块有几个人复制几段\vspace{0\baselineskip} %这一行控制作者间隔,可视情况改数字!!!!!!!!

这里是萤石ym的学习路途,努力搬砖! 5535

创建索引的条件

总的来说:唯一、不为空、经常被查询的字段。

Edward的博客 321

国内开发者福音:手把手教你用微软Authenticator搞定GitHub 2FA验证(附Recovery Codes保存指南)

本文详细介绍了国内开发者如何使用微软Authenticator中国版轻松配置GitHub双重身份验证(2FA),解决短信验证不可用和国际验证器访问困难的问题。重点强调了恢复码(Recovery Codes)的安全备份策略,确保账户安全无忧。

weixin_28840143的博客 435

音视频入门:H264、H265概念总结

添加链接描述 什么是H.264与H.265 H.264与H.265都是视频压缩格式,由于视频本身的码流太大,所以需要经过压缩然后再通过网络进行传输。H.264是目前比较主流的压缩算法,像视频会议设备一般都采用这个编码格式。基础的H.264可以支持在1M带宽下传输720P30帧/秒的图像;H.264 HIGH PROFILE支持在512K带宽下传输720P30帧/秒的图像。 H.265是比较新的压缩算法,可以更一步提高压缩比,随着我们现在生活中出现的视频格式越来越大(比如现在基本都是1080P甚至4K的显示器

weixin_40673765的博客 8937

mysql索引需要的条件

一、数据库索引创建规则 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:  正确...

Samurai77的博客 2095

ST-CNN实战:用Python实现交通流量预测(附完整代码)

本文详细介绍了如何利用时空卷积神经网络(ST-CNN)进行交通流量预测的实战过程。通过Python和PyTorch,从数据预处理、构建邻接矩阵,到ST-CNN核心模块的代码实现与模型训练,提供了完整的解决方案,帮助开发者掌握处理时空序列数据的核心算法。

rust6ferris的博客 926

深入解读索引在查询中的使用

索引在查询中的作用到底是什么?在我们的查询中发挥着什么样的作用 呢? 请记住: 1 、一个索引就是一个 B+树,索引让我们的查询可以快速定位和扫描到我们 需要的数据记录上,加快查询的速度。 2 、一个 select 查询语句在执行过程中一般最多能使用一个二级索引,即 使在 where 条件中用了多个二级索引。 3.2.3.1. 扫描区间 对于某个查询来说,最简单粗暴的执行方案就是扫描表中的所有记录,判断 每一条记录是否符合搜索条件。如果符合,就将其发送到客户端,否则就跳过该 记录。这就是全表扫描。

b379685397的博客 3522

Ansys Maxwell磁场仿真入门:无线传能线圈自感与互感计算全流程

本文详细介绍了使用Ansys Maxwell进行无线充电线圈磁场仿真的全流程,包括模型建立、求解器设置、电感参数提取及优化策略。通过实战案例,帮助工程师掌握线圈自感与互感计算技巧,提升无线充电系统设计效率与精度。重点解析了Maxwell在磁场仿真中的关键应用,适用于电磁场仿真初学者和进阶用户。

weixin_29047545的博客 440

基于 MATLAB 的综合能源系统建模案例 

电平衡约束:P_{gt}(t)+P_{grid}(t)-P_{eb}(t)-P_{load}(t)=0,其中 P_{grid}(t) 为与外部电网的交互功率(正表示购电,负表示售电)。- 电锅炉的热输出功率 Q_{eb} 与输入电功率 P_{eb} 的关系为:Q_{eb}=\eta_{eb}\times P_{eb},其中 \eta_{eb} 为电锅炉的热效率。- 燃气轮机的余热回收功率 Q_{gt} 与发电功率也存在一定关系,例如:Q_{gt}=c\times P_{gt},c 为余热回收比例系数。

qq_57128262的博客 1395

索引的建立和查询以及对索引场景建立

      索引的原理与作用,各种书籍和网络上的介绍可以说是铺天盖地,基本上主流数据库系统的也都是一致的。选择索引字段的原则,比如外键字段、数据类型较小的字段、经常用于查询或排序的字段、表关联的字段等等,在此不做赘述。本人在工作中见到过很多人创建的索引,回想自己以前也会有理论知识空洞的体会,总感觉理论知识无法与具体的工作问题相匹配。在此仅以工作学习中积累的一点经验和问题场景整理以飨读者。先把常见的...

曹小墨的博客 492

手把手教你学Simulink——基于Simulink的CLLC谐振变换器双向对称控制

本文介绍了一种基于Simulink的CLLC谐振变换器双向对称控制方法。针对CLLC拓扑的多阶谐振特性,采用固定频率、50%占空比、仅调节相位差的对称控制策略,实现了宽电压范围调节和全负载ZVS软开关。详细阐述了Simulink建模步骤,包括功率级搭建、相位差生成逻辑和双向切换实现,并通过仿真验证了稳态性能和双向无缝切换能力。该方法解决了传统PFM控制的不足,具有控制简单、效率高、易于工程实现的优势,适用于车载充电和储能系统等双向功率应用场景。

MHD0815的博客 302

es 多索引联合查询_es组合多个条件进行查询

GET /test_index/_search{"query": {"bool": {"must": { "match": { "name": "tom" }},"should": [{ "match": { "hired": true }},{ "bool": {"must": { "match": { "personality": "good" }},"must_no...

weixin_29018419的博客 8071

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数据库索引有哪些?什么是回表?什么是索引下推?mysql查询如何优化

索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。首先mysql分为三层:service层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索等、引擎层、文件系统层。索引下推就是把之前服务层做的检索筛选工作,现在让引擎层去先做了,这样可以有效减少回表次数,也就是要减少IO操作,提升性能。

Romantic丶的博客 1821

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MySQL索引设计-从条件顺序到范围查询的优化策略

本文系统解析了MySQL索引设计策略,重点针对条件顺序不确定和范围查询场景提供优化方案。核心内容包括:单独索引与复合索引的特性比较;四种典型查询场景下的索引选择策略;范围查询对复合索引的截断机制分析;以及覆盖索引、执行计划验证等补充建议。文章强调应根据查询模式(等值/范围、字段顺序)设计复合索引,利用最左前缀原则优化性能,同时需权衡索引维护成本与实际查询需求。通过合理设计索引结构和验证执行计划,可显著提升数据库查询效率。

jakelihua 2020

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SQL语句的书写顺序与实际执行顺序的差异,以及如何利用执行顺序优化查询性能

SQL 的书写顺序和执行顺序并不一致,理解执行顺序对于编写高效的 SQL 语句至关重要。通过合理利用执行顺序,避免 SELECT *、在 WHERE 和 JOIN 中使用索引、以及使用EXPLAIN分析执行计划,能够有效提升查询性能。理解 SQL 引擎的执行逻辑,是优化查询的关键所在。

开源AI 专属 UI——papyrai-ui。《千界明彻录》(故事形式构建元思维)——胡说小说。更多思辨内容在公众号。 2037

大模型遇见数据库:DB-GPT

使用数据库任务的输入x,我们可以向输入x添加额外的文本信息,称为输入提示x’,这有助于LLM更好地理解任务要求。然而,不同的输入可能对应不同的最佳提示(例如,不同结构的查询可能需要不同的重写示例),用户很难给出好的提示。我们需要构建一个提示生成器,自动为输入x派生提示。方法论在提示中主要有两个关键部分:(i)指导LLM的指令,以及(ii) LLM模拟的演示示例。生成的提示应该通过LLM的反馈进行验证,基于此,我们可以优化生成器,以获得良好的LLM性能。

xx_nm98的博客 1583

MySQL查询条件的顺序是否影响查询效率

MySQL WHERE条件顺序不影响查询性能,优化器会自动调整执行顺序。关键在于联合索引定义顺序,需遵循最左前缀原则,等值条件在前、范围条件在后。常见误区是将SQL书写顺序与索引顺序混淆。实际性能优化应关注:合理设计联合索引、避免索引失效操作(如函数包裹、隐式转换等)、减少回表查询等。建议统一WHERE条件书写规范(等值在前范围在后)以提高可读性,而非性能。使用EXPLAIN验证可发现不同书写顺序的执行计划完全一致。

得塔云的博客 377

MySQL索引调优之索引顺序是否应该“匹配查询书写顺序”?

文章摘要: 建议保持原复合索引顺序(res_speciality_id, ph_status, del_flag, is_delete, manage_stage),而非将范围查询字段manage_stage提前。原因:1)等值查询字段应优先按选择性高低排列;2)范围条件(如IN)会使后续索引字段失效,降低查询效率。MySQL优化器会按索引定义顺序匹配最左前缀,与SQL书写顺序无关。原索引设计符合"等值字段在前+范围字段最后"的最佳实践,能最大化利用索引定位能力。

小小默:进无止境 490

PostgreSQL/pgsql数据库优化查询和索引的猜想

此文是我做为日记来用的,后面再规范和整理 1、索引太多会影响Insert、Update; 2、索引太少不利于性能调优; 3、数据结构分析、SQL拼写的分析如果太复杂,又不利于实际的开发工作; 故,是否可以这样: 1、第一步,确定某个表可能用到的、经常使用的查询条件,不建议加索引的字段后面会忽略 SELECT * FROM t_big_data aa WHERE 1=1 AND aa.billingtime>='2021-08-01' AND aa.billingtime&

即使放弃那棵树,也无法拥抱森林 3338

MySQL优化书写高质量sql语句

1. 查询SQL尽量不要使用全查 select *,而是 select + 具体字段。 反例: select * from student; 正例: select id,name, age from student; 理由: 只取需要的字段,可以节省资源、减少CPU和IO以及网络开销。 select * 进行查询时,无法使用到覆盖索引,就会造成回表查询。 使用具体字段可以减少表结构变动带来的影响。 2. 使用预编译语句进行数据库操作 理由: 预编译语句可以重复使用计划,减少SQL编译所需要

Java小皮孩 1万+

面试竟然挂在了sql语句的书写顺序以及执行顺序上面

一同学去面试,面试官让说一下sql的执行顺序,他尽然答错了,面试也就到此结束了!实属不应该。。。

扬帆向海的博客 1万+

mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)

索引使用简介一、 关于索引的知识要写出运行效率高的sql,需要对索引的机制有一定了解,下面对索引的基本知识做一介绍。1、 索引的优点和局限索引可以提高查询的效率,但会降低dml操作的效率。所以建立索引时需要权衡。对于dml操作比较频繁的表,索引的个数不宜太多。2、 什么样的列需要建索引?经常用于查询、排序和分组的列(即经常在where、order或grou...

weixin_39887183的博客 6814
上一篇: 自己最近写的一组日志处理类(线程调度优化)
下一篇: WinPhone7使用调用WCF传递对象
广州接入
广州接入 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄24年 2224粉丝 731原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值