数据库SQL语言实战(九)(索引)

目录

1实战目标

2前提知识

2.1索引失效的情况

2.1.1数据准备

 2.1.2插入数据

2.1.3失效情况

3练习题(利用索引提高查询速度)

题目一

题目二​

题目三​

题目四​

题目五​

 总结 


1实战目标

对比有无索引情况下数据检索速度,学会如何能够使用索引,掌握如何查询是否使用索引了

2前提知识

本次实战专注点在于如何利用索引来提高查询的效率。在使用索引的过程中我们不难发现有一些情况select查询语句是无法使用索引的,下面就对这些情况做一个总结

2.1索引失效的情况

2.1.1数据准备

新建一张学生表,并添加id为索引,id+age为索引。这里索引类型的选择权交给Oracle,Oracle会根据数据类型和数量自我选择

create table `student` (
  `id` int not null comment 'id',
  `name` varchar(255) collate utf8mb4_bin default null comment '姓名',
  `age` int default null comment '年龄',
  `birthday` datetime default null comment '生日',
  primary key (`id`),
  create index `idx_name` on `student` (`name`),
  create index `idx_name_age` on `student` (`name`,`age`)
) engine=innodb default charset=utf8mb4 collate=utf8mb4_bin;

 2.1.2插入数据

insert into `student` values (1, '张三', 18, '2021-12-23 17:12:44');
insert into `student` values (2, '李四', 20, '2021-12-22 17:12:48');

2.1.3失效情况

1、查询条件中有or,即使有部分条件带索引也会失效

例如:

select * from `student` where id =1 or birthday = "2021-12-23"

此时id有索引但是birthday没有索引,所以索引将会失效

 总结:查询条件中带有or,除非所有的查询条件都建有索引,否则索引失效

2、 like查询是以%开头

例如:

select * from student where name like "%三"

 总结:模糊查询不能以%开头,但是可以把%放在查询条件的后面

 3、索引类型和列类型要匹配

假如列类型为字符串,在查询时查询语句如下:

select * from student where name = 2222

此时查询将不会用索引,使用索引正确为:

select * from student where name = "张三"

  总结:索引建立时类型为列值的类型,后面想要使用该索引要求查询列的类型和索引类型相同

4.索引值和列的值需要相同

在创建索引时使用的是当时列的值,假如在查询时对列的值进行了变化(计算),此时索引就将失效。例如:

select * from student where id-1 = 1

此时id-1会修改原本列的值(不是真的修改,是查询下的暂时修改),这会导致索引查询不可用 

5.违背最左匹配原则

例如:

select * from student where age =18

由于此时关于age的索引是联合索引(name,age),在查询建立在联合索引基础上且第一个联合索引字段未生效时,第二个字段也不会生效 

 总结:联合索引的使用必须要符合最左匹配原则

6.如果mysql估计全表扫描要比使用索引要快,会不适用索引

7.other

这里对6、7的情况不再细致分析,如果大家平常在写sql时有遇到再去查找资料即可。常见的索引失效情况就是前面5种

3练习题(利用索引提高查询速度)

题目一

创建表格:

create table test7_01 as
select S.sid, S.name, S.birthday
from pub.student S

执行查询操作,观察查询时间 :

select * from 
(select sid,name,birthday,
	(select count(*) from test7_01 where substr(name,1,1)=substr(t1.name,1,1)) samefirstname 
from pub.student_testindex t1)
where samefirstname=7

此时查询时间为:13.78s

create index test7_01_index  on test7_01 (substr(name,1,1))

再次执行查询操作,观察查询时间 : 

select * from 
(select sid,name,birthday,
	(select count(*) from test7_01 where substr(name,1,1)=substr(t1.name,1,1)) samefirstname 
from pub.student_testindex t1)
where samefirstname=7

此时查询时间为:0.297s

关键点:

1、 创建一般索引的方法:

CREATE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);

例如:

CREATE INDEX idx_name ON students (name);

2、索引只能在table中建立,不能在view中建立

3、创建一个普通索引(索引有colum1、colum2),这将有助于提高通过colum1和colum2进行搜索的查询性能

4、索引类似于目录,利用colum1创建索引就是以colum1为关键词建立一个目录

题目二

create table test7_02 as
select sid,name,birthday from pub.student;
update test7_02
set birthday=to_date('19881018','yyyymmdd')
where substr(sid,12,1)='0'
create index test7_02_index on test7_02 (birthday,name)

关键点:

1、 在一般的where =语句中,索引是能正常运行的

2、验证问题是无法使用索引的。因为索引查询必须要符合最左匹配原则

题目三

create view test7_03 as 
select * from
(select sid,name,birthday,
(select count(*) from pub.student
where name like substr(t1.name,1,1)||'%'
) samefirstname 
from pub.student_testindex t1)   
where samefirstname=7

 关键点:

1、substr等函数中的操作不会调用索引

2、like语句匹配的是字符串

3、||‘%’作用是字符串连接

题目四

create view test7_04 as
select * from 
(select sid,name,birthday,
  (select count(*) from pub.student
   where birthday >= trunc(t1.birthday,'mm') and birthday <=last_day(t1.birthday)
  ) sameyearmonth,
  (select count(*) from pub.student 
   where birthday >= trunc(t1.birthday,'YYYY') and birthday <= last_day(add_months(trunc(t1.birthday,'yyyy'),11))
  ) sameyear
from pub.student_testindex t1
) 
where sameyearmonth=35

关键点:

1、to_char函数可以直接用来提取birthday中的年月日,但是使用函数会导致无法使用索引。因为使用函数后,会导致列的值发生变化,而索引是利用原始值来创建的,所以索引将会失效

2、所以这里仍然要用原始的列birthday来比较

3、trunc:能够对输入的列的值按要求来截取('mm'表示截取到月份),同时会将剩余部分自动设置为日期的起始值(因为日期必须完整才有意义)

      last_day:返回birthday所在月份的最后一天

4、add_months:用于给日期添加月份值

题目五

create view test7_05 as 
select * from 
(select sid,name,birthday,
(select count(*) from pub.student 
  
where birthday=t1.birthday+1
  
) nextbirthday
from pub.student_testindex t1) where nextbirthday=7

关键点:

1、本题标红语句无法使用索引的原因:创建索引使用的是原始的列值。后面where语句中的birthday-1操作会先将birthday列的值减去1后形成新的列再与t1比较,所以此时无法使用索引

2、想要使用索引where语句左边都只能保留原始的列,不允许对列得值进行修改

 总结 

本文的所有题目均来自《数据库系统概念》(黑宝书)、山东大学数据库实验七。不可用于商业用途转发。

如果能帮助到大家,大家可以点点赞、收收藏呀~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/632695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

130.哈希表:赎金信(力扣)

题目描述 代码解决 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 创建一个大小为26的整数数组&#xff0c;用于存储每个字母在magazine中的出现次数int hash[26] {0};// 遍历magazine&#xff0c;将每个字母的出现次数记录在hash数组…

The 13th Shandong ICPC Provincial Collegiate Programming Contest

The 13th Shandong ICPC Provincial Collegiate Programming Contest The 13th Shandong ICPC Provincial Collegiate Programming Contest A. Orders 题意&#xff1a;有n个订单&#xff0c; 每日可生产k个产品&#xff0c;每个订单给出交付日和交付数量&#xff0c;是否能…

谈谈【软件测试的基础知识,基础模型】

关于软件测试的基本概念和基本模型 前言一个优秀的测试人员具备的素质关于需求测试用例软件错误(BUG)概念开发模型瀑布模型&#xff08;Waterfall Model&#xff09;螺旋模型&#xff08;Spiral Model&#xff09; 前言 首先,什么是软件测试? 通俗来讲:软件测试就是找BUG&…

Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录 1. 简介 2. 代码解析 2.1 原始代码 2.2 优化后 2.3 分析优化措施 3. 总结 1. 简介 在Vitis HLS中&#xff0c;实现II&#xff08;迭代间隔&#xff09; 1是提高循环执行效率的关键。II1意味着每个时钟周期都可以开始一个新的迭代&#xff0c;这是最理想的情况&…

Java面试八股之HashSet和TreeSet有什么区别

Java中HashSet和TreeSet有什么区别 1. 底层数据结构 HashSet: 基于哈希表&#xff08;实际上是 HashMap 的内部实现&#xff09;实现。每个元素通过其 hashCode() 方法计算出哈希码&#xff0c;并通过哈希码确定其在哈希表中的位置。这种结构使得 HashSet 在插入、删除和查找…

Win11下Java环境安装指南

Windows下Java环境安装指南 前言一、安装简介JDK与JRE安装包 二、JDK安装检查操作系统类型基于Win11基于Win10 安装包准备工作 三、配置环境配置JAVA_HOME配置Path配置CLASSPATH 四、检验配置是否打开cmd命令行窗口输出java -version命令 五、注意事项 前言 在Windows系统上安…

数据结构-栈(带图)

目录 栈的概念 画图理解栈 栈的实现 fun.h fun.c main.c 栈的概念 栈&#xff08;Stack&#xff09;是一种基本的数据结构&#xff0c;其特点是只允许在同一端进行插入和删除操作&#xff0c;这一端被称为栈顶。遵循后进先出&#xff08;Last In, First Out, LIFO&#…

yarn : 无法加载文件 C:\app\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本

系统运行yarn命令报错 解决办法&#xff1a; 一、点击电脑右下角的开始&#xff0c;菜单出来后&#xff0c;直接按键盘输入powerShell搜索&#xff0c;然后右键以管理员身份运行 二、以管理员运行后&#xff0c;会出现下面命令窗口 在窗口上执行&#xff1a;set-ExecutionPoli…

羊大师分析,羊奶健康生活的营养源泉

羊大师分析&#xff0c;羊奶健康生活的营养源泉 羊奶&#xff0c;作为一种古老的饮品&#xff0c;近年来因其独特的营养价值和健康益处而备受关注。今天&#xff0c;羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…

哪家PMP培训机构比较优秀?

不同的培训机构在服务、收费和师资上会有一些差异&#xff0c;但基本都差不多。老师的授课方式对学习兴趣很重要&#xff0c;价格在3000-4000左右&#xff0c;选择中间价位比较好。服务也很关键&#xff0c;有的机构提供代报名和PDU等额外服务。关于机构排名的文章可以参考&…

InnoDB 事务处理机制

文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…

CCF20181201——小明上学

CCF20181201——小明上学 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int r,y,g,n,k[101],t[101],sum0;cin>>r>>y>>g;cin>>n; for(int i0;i<n;i){cin>>k[i]>>t[i];if(k[i]0||k[i]1)sumt[i];…

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…

Xilinx RAM IP核的使用及注意事项

对于RAM IP核(Block Memory Generator核)的使用以及界面的配置介绍&#xff0c;文章RAM的使用介绍进行了较详细的说明&#xff0c;本文对RAM IP核使用中一些注意的地方加以说明。 文章目录 三种RAM的区别单端口RAM(Single-port RAM)简单双端口RAM(Simple Dual-port RAM)真双端…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

翻译《The Old New Thing》- Stupid debugger tricks: Calling functions and methods

Stupid debugger tricks: Calling functions and methods - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20070427-00/?p27083 Raymond Chen 2007年04月27日 一个比较笨的调试技巧&#xff1a;调用函数和方法 在过去&#xff0c;如果你想在…

css+html 爱心❤

效果 代码实现 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

给app引导页说goodbye吧,皮之不存,毛将焉附。

有几个原因导致大部分创业者选择不开发独立的移动应用程序&#xff08;App&#xff09;&#xff1a; 成本和资源&#xff1a;开发和维护一个独立的移动应用程序需要投入大量的时间、资金和人力资源。对于创业公司来说&#xff0c;他们可能没有足够的资源来支持这样的开发和维护…

大数据性能测试怎么做?看完这篇终于懂了!

大数据性能测试的目的 1.大数据组件的性能回归&#xff0c;在版本升级的时候&#xff0c;进行新旧版本的性能比对。 2.在新版本/新的生产环境发布之后获取性能基线&#xff0c;建立可度量的参考标准&#xff0c;为其他测试场景或者调优过程提供对比参考。 3.在众多的发行版本…

【好书推荐-第十六期】《 LangChain技术解密:构建大模型应用的全景指南》(Github 6800+示例!)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…