为什么用了索引,搜索速度还是很慢

索引列选择不当

1.假设有一个包含性别信息的表,其中有1000条记录,其中男性占 99%、女性占 1%。如果在性别列上创建索引,由于选择性太低,大部分查询都会涉及到表中的绝大多数行,这时候数据库优化器可能会认为全表扫描比使用索引更有效率,因为使用索引仍需要访问大部分数据。

2.相反,如果在一个包含唯一用户 ID 的表上创建索引,那么索引的选择性会很高,因为每个用户 ID 都是唯一的。在这种情况下,使用索引来查询用户数据会非常有效,因为查询结果集很小,数据库可以快速定位到所需的行。

因此,在选择索引列时,需要考虑查询的频率和字段的选择性,尽量选择在查询中经常被用到并且具有较高选择性的列作为索引列,以提高索引的效率和搜索速度。

索引列类型不匹配 

举个例子,假设有一个表包含一个名为 "age" 的列,存储用户的年龄信息。如果我们在 "age" 列上创建了一个整数类型的索引,然后尝试使用字符串类型的查询条件来搜索年龄为 30 的用户,那么这个索引就无法被有效利用,查询会退化为全表扫描,性能会大幅下降。

为了避免这种情况,我们应该确保索引列的数据类型和查询条件的数据类型一致。在上述例子中,如果我们将查询条件改为整数类型,比如搜索年龄为 30 的用户,那么数据库系统就可以有效地利用 "age" 列上的索引,提高搜索速度。

索引列过多

1.在实际应用中,每个索引都需要占用额外的存储空间,并且在数据修改时需要维护索引结构,因此创建过多的索引会增加数据库系统的负担。此外,每个查询在执行时都需要选择合适的索引,如果存在过多的索引,数据库系统可能会花费更多的时间来选择合适的索引,从而降低查询性能。

2.另外,过多的索引列还可能导致索引的失效。例如,如果一张表上存在多个索引,而且这些索引的列有重叠,那么数据库系统在选择索引时可能会选择不合适的索引,导致索引失效,从而无法提高查询性能。

举个例子,假设有一个表包含 "name" 和 "age" 两列,我们在 "name" 列和 "age" 列上分别创建了索引。现在我们执行一个查询,条件是根据姓名进行筛选,比如 "WHERE name = 'John'"。在这种情况下,数据库系统可能会选择使用 "name" 列上的索引来执行查询,因为这个索引可以快速定位到姓名为 'John' 的行。

然而,如果我们在 "name" 列和 "age" 列上都创建了索引,并且查询条件中只包含 "name" 列,数据库系统可能会错误地选择使用 "age" 列上的索引来执行查询,因为它认为 "name" 列的索引并不是最优选择。这样就导致了索引失效,因为使用 "age" 列的索引并不能快速定位到姓名为 'John' 的行,而是需要进行全表扫描,从而降低了查询性能。

查询条件不适合使用索引 

查询条件不适合使用索引可能表现为以下几种情况:

不是索引列:查询条件中包含的列并没有在数据库表上创建索引。在这种情况下,数据库系统无法利用现有的索引来加速查询,因此可能会放弃使用索引,而选择执行全表扫描。

函数操作:查询条件中使用了函数操作,如对列进行运算、函数计算或类型转换等。这样的函数操作可能会导致索引失效,使得数据库系统无法使用索引加速查询。因为这些操作可能会改变了列的值的形式或计算结果,使得索引无法准确地反映原始数据的内容。

条件范围过大:查询条件中包含了范围查询,如大于、小于、区间等条件,而且范围过大,覆盖了大部分甚至全部的数据。在这种情况下,即使存在索引,数据库系统也可能会放弃使用索引,而选择执行全表扫描,因为使用索引也无法有效地减少扫描的数据量。

逻辑操作符:查询条件中使用了逻辑操作符,如逻辑与、逻辑或等。这些逻辑操作符可能会使得索引失效,导致数据库系统无法使用索引加速查询。

不适合索引类型:查询条件中使用了不适合索引类型的操作,如模糊查询、正则表达式匹配、非等值查询等。这些操作可能会使得索引失效,使得数据库系统无法有效地利用索引来加速查询。

表数据量较小

表数据量较小时,即使没有使用索引,数据库系统也能够在较短的时间内完成查询操作。因此,索引对查询性能的影响可能相对较小,甚至可以不使用索引而直接进行全表扫描。

什么是索引失效

索引失效指的是数据库查询过程中,由于某些原因导致数据库系统无法有效地利用索引来加速查询,从而降低了查询性能。索引失效可能会导致数据库系统无法高效地执行查询操作,需要进行全表扫描或者其他低效的查询方式,影响了系统的性能和响应速度。

什么情况会出现索引失效:

不适合索引的查询条件: 如果查询条件不适合使用索引,例如包含了对索引列进行了运算、函数计算、类型转换等操作,或者包含了模糊查询、正则表达式匹配、非等值查询等操作,这些操作会导致索引失效。

索引选择不当: 数据库系统在执行查询时可能会选择错误的索引,导致索引失效。这可能是由于数据库统计信息不准确、索引选择器算法不完善或者查询条件变化导致的。

索引列顺序不合理: 如果查询条件中的列顺序与索引的列顺序不一致,可能会导致索引失效。例如,如果索引是多列索引,但查询条件中的列顺序与索引列顺序不匹配,索引可能无法生效。

索引列数据分布不均匀: 如果索引列的数据分布不均匀,例如存在大量重复值或者数据倾斜的情况,可能会导致索引失效。这会使得索引无法准确地过滤出符合条件的数据,从而导致索引失效。

索引列上存在大量NULL值: 如果索引列上存在大量NULL值,可能会导致索引失效。因为数据库系统在执行查询时通常会忽略NULL值,这会导致索引无法准确地过滤出符合条件的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SpringCloud] Feign Client 的创建 (二) (五)

文章目录 1.自动配置FeignAutoConfiguration2.生成 Feign Client2.1 从Feign Client子容器获取组件2.2 Feign Client子容器的创建2.3 构建Feign Client实例 1.自动配置FeignAutoConfiguration spring-cloud-starter-openfeign 包含了 spring-cloud-openfeign-core FeignAutoCo…

HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。

介绍 本篇Codelab基于基础组件、容器组件,实现一个支持加减乘除混合运算的计算器。 说明: 由于数字都是双精度浮点数,在计算机中是二进制存储数据的,因此小数和非安全整数(超过整数的安全范围[-Math.pow(2, 53)&#…

【详解】运算放大器工作原理及其在信号处理中的核心作用

什么是运算放大器 运算放大器(简称“运放”)是一种放大倍数非常高的电路单元。在实际电路中,它常常与反馈网络一起组成一定的功能模块。它是一种带有特殊耦合电路和反馈的放大器。输出信号可以是输入信号的加法、减法、微分和积分等数学运算…

vue3+ts项目 | axios 的测试 | 测试接口

在 App.vue 中,测试接口 // 测试接口import request from /utils/request;import { onMounted } from vue;onMounted(() > {request.get(/hosp/hospital/1/10).then((res) > {console.log("APP组件展示获取的数据",res);})}) 在request.ts中&…

link 样式表是否会阻塞页面内容的展示?取决于浏览器,edge 和 chrome 会,但 firefox 不会。

经过实测: 在 head 中 link 一个 1M 大小的样式表。设置网络下载时间大概为 10 秒。 edge 和 chrome 只有在下载完样式表后,页面上才会出现内容。而 firefox 可以直接先显示内容,然后等待样式表下载完成后再应用样式。 DOMContentLoaded 事…

Vue指令之v-for

跟其他语言中的for一样,是用来渲染多个类似实例的。 语法为v-for"(item, index) in 可迭代对象",一般就用于遍历数组。这里的语法跟Python中的for循环enumerate也有点相似之处,但要注意item在前,index在后,…

探索Java学习的精华:必备资料分享

239程序员职业规划手册 238手把手带你写一个MiniTomcat 237Rust语言从入门到实战 236超级访谈:对话道哥 235LangChain实战课 234云时代的JVM原理与实战 233AI大模型系统实战 231AI绘画核心技术与实战【未完整】 Java核心技术面试精讲 从0开始学架构 推荐系统三十六式…

CommandLineRunner解释学习

目录 一、CommandLineRunner介绍 1.1 接口定义 1.2 工作原理 二、CommandLineRunner作用 三、CommandLineRunner使用方式 3.1 实现CommandLineRunner 3.2 配置Spring Boot项目 四、完整代码地址 小剧场:坚持不懈! 一、CommandLineRunner介绍 Co…

anaconda配置虚拟python环境

使用conda create命令 举例: 创建一个名为breed的新环境,并在其中安装python 3.7版本的步骤: 创建虚拟环境 conda create --name breed python3.7激活新创建的环境: conda activate breed查看存在的虚拟环境 conda env list退…

复杂度3 二分查找函数

文章预览&#xff1a; 题目算法代码 题目 算法 本题要求用二分法查找顺序表的一个值&#xff0c;比较简单注意指针格式即可 代码 Position BinarySearch( List L, ElementType X ) {int begin1,mid;int endL->Last;ElementType temp;while(begin<end){mid(beginend)/2…

【Spring Security】 快速入门

文章目录 一、 身份认证Demo1、创建工程2、代码编写2.1、Controller2.2、Html2.3、application.properties配置 3、启动项目并访问 二、Spring Security 默认做了什么二、底层原理1.概述2.FiltersDelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters 三…

Java学习指南:从基础到进阶,一篇文章带你全面了解!

一、Java语言概述 Java是一种面向对象的编程语言&#xff0c;它不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念。Java语言具有功能强大和简单易用两个特征&#xff0c;即Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向…

vue3-pinia使用(末尾有彩蛋)

什么是 pinia Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 之前用的是 vuex&#xff0c;后面 vue 官方团队不维护了&#xff0c;推荐使用 pinia 安装 yarn add pinia # 或者使用 npm npm install piniapnpm install piniaStore 是什么&#xf…

实验一 Python集成开发环境的搭建及可视化库的安装

一、安装集成开发环境 下载安装包 官方网址&#xff1a; Free Download | Anaconda 或者镜像网站下载&#xff08;较快&#xff09; https://repo.anaconda.com/archive/ 安装 配置环境变量 验证 输入&#xff1a; conda -V 二、下载pyecharts环境 点击 Anaconda Promp…

探索实战课程的魅力

在当今迅速变化的时代&#xff0c;学习不仅仅是获取知识&#xff0c;更是掌握实用技能的关键。随着在线学习的兴起&#xff0c;实战课程在培养学生实践能力方面发挥着越来越重要的作用。本文将探讨实战课程的魅力&#xff0c;以及它们对个人职业发展的巨大影响。 深度学习的机…

spring-boot之shiro安全框架配置使用

shiro架构&#xff08;外部&#xff09; shiro架构(内部) 具体API操作 获取当前的用户对象 Subject currentUser SecurityUtils.getSubject();通过当前用户拿到session Session session currentUser.getSession(); session.setAttribute("someKey", "aValu…

微信公众号运营必备工具合集

微信公众号运营必备工具合集 各位同学&#xff0c;想要成为一名合格的公众号运营&#xff0c;必须要搭建一个属于自己的运营工具库&#xff0c;可以在日常工作中最大限度的提高效率。 91微信编辑器 &#xff1a;http://bj.91join.com/ 壹伴助手&#xff1a;https://yiban.io…

在assembleRelease之前执行自定义任务

背景 在实际的Gradle项目开发中&#xff0c;我们总是会遇到一些需求&#xff0c;要在release编译的时候执行一些任务&#xff0c;但debug时不需要。然而&#xff0c;Gradle编译有自己的一套生命周期&#xff0c;比如Android项目的assembleRelease任务在编译启动之前是没有办法…

下载及安装PHP,composer,phpstudy,thinkPHP6.0框架

文章目录 前言 thinkPHP是一款开源的PHP框架&#xff0c;它是基于MVC&#xff08;Model-View-Controller&#xff09;设计模式构建的。thinkPHP提供了丰富的功能和组件&#xff0c;使得开发人员可以快速、高效地构建和维护Web应用程序。 以下是thinkPHP框架的一些特点和功能&…

2023年欧亚地区网络安全态势综述

文 | 中国社会科学院俄罗斯东欧中亚研究所研究员 肖斌&#xff1b;中国社会科学院大学国际政治经济学院研究助理 刘聪 网络安全问题是一个复杂的问题&#xff0c;不仅涉及技术发展&#xff0c;也包含诸多政治色彩。尽管数字空间拉近了互联用户的距离&#xff0c;但是在国际政治…