索引的使用

news/2024/7/5 7:16:58

索引是一种数据结构,用于快速查找数据库中的数据。索引可以加快查询的速度,并减少数据库的负载和响应时间。以下是使用索引的一些方法:

1.创建索引:可以通过CREATE INDEX语句创建索引。在创建索引时,需要指定要创建索引的表及其列。
例如:在“my_table”的表的“my_column”列上创建索引的SQL语句:
CREATE INDEX my_index ON my_table (my_column);
创建复合索引:
例如,我们要在名为employee的表中创建一个名为aaa的复合索引,包含age和salary两列,可以使用以下语句:
CREATE INDEX aaa ON employee (age, salary);

请注意,创建索引会增加存储需求,并且会影响INSERT、UPDATE和DELETE操作的性能。因此,需要仔细考虑哪些列需要索引,以及它们的顺序和其他属性。

2.删除索引:要删除MySQL索引,需要使用ALTER TABLE语句,使用DROP INDEX子句指定要删除的索引名称。
例如:将“mytable”的表,删除一个名为“myindex”的索引,可以使用以下命令:
ALTER TABLE mytable DROP INDEX myindex;

3.选择正确的列:为了更好地利用索引,应该选择一些常常被查询的列来创建索引。

4.使用复合索引:一个表中的数据在查询时有多个字段总是同时出现,这些字段就可以组合成复合索引。复合索引是由多个列组成的索引,在数据库查询时,可以同时使用这些列来进行查找和排序。复合索引可以提高查询效率,减少数据库的读取次数和磁盘的访问量。当查询条件中有多个列的时候,使用复合索引可以更快地定位到正确的数据行。

复合索引的使用也需要考虑到以下几点:
索引的列顺序要考虑到查询时的条件,通常会把使用最频繁的列放在前面
索引列的选择要尽量覆盖查询条件,避免使用到没有建索引的列。
复合索引的建立也需要考虑到索引的数量,如果索引过多会对数据库的性能造成影响。
复合索引也要定期进行优化和维护,避免出现失效的情况。

5.避免使用过多的索引:使用过多的索引会影响性能,因此应该避免创建过多的索引。

6.定期维护索引:定期维护索引可以确保其性能和可用性。

7.在使用索引时需要注意以下几点
1、索引需要耗费额外的存储空间,因此需要权衡存储空间和查询效率。
2、索引需要在数据插入、更新、删除时进行维护,因此会增加写入操作的时间开销。
3、对于一些数据量较小的表,索引可能会影响查询效率。
4、需要根据具体的查询需求建立合适的索引,建立不必要的索引会浪费存储空间。

8、索引失效:是指在数据库中创建的索引无法被有效使用,导致查询或操作的执行效率下降。这种情况可能会出现在以下情况中:

  1. 数据库中的数据发生了变化,例如数据被插入、更新或删除,导致索引中的数据不再正确地反映实际数据。

  2. 查询语句中的条件不利于索引的使用,例如使用了不等于、or运算符、函数(如DATE(),UPPER()等)等操作,那么数据库系统就无法将这些函数和索引进行匹配,从而无法使用索引。

  3. 数据库表中数据分布不均:如果表中数据不均匀分布,索引就可能失去效果。例如,一张顾客信息表中,大部分顾客都是来自东部地区,少部分是来自西部地区,如果按照地区名称建立索引,那么查询“来自东部地区的顾客”时索引就无法发挥作用,因为大部分数据都是“东部地区”,查询时需要扫描大量数据。

  4. 数据表中的数据量太大:如果表中数据量太大,索引就会失效。当索引的选择性(即不重复的索引值和表中记录总数的比率)很低时,使用索引就不如全表扫描快。

数据表中的缺陷:如果数据表中的数据存在缺陷,如数据冗余、数据类型不匹配等问题,就可能导致索引失效。

为了避免索引失效的情况,可以采取以下措施:

  1. 定期维护索引,包括优化索引结构、重建索引、统计索引信息等。
  2. 合理的设计查询语句,避免使用不利于使用索引的操作符和函数。
  3. 避免在数据库中存储大量重复的数据,如可以通过引入外键来进行关联,以优化索引使用效率。
  4. 针对数据量大的情况,可以考虑采用分库分表的方式来减少索引需要占用的空间和操作所需的资源。

通常来说,对于需要频繁进行查询的列或者经常作为查询条件的列,可以考虑建立索引。建立索引可以使用CREATE INDEX语句,删除索引可以使用DROP INDEX语句,查询优化器会自动使用合适的索引。

补充一个:最左原则:(这个是关于复合索引的)
譬如在表aaa中建立复合索引(column_1, column_2, column_3)
select * from aaa where column_2=‘a’
select * from aaa where column_3=‘a’
select * from aaa where column_2=‘a’ and column_3=‘a’
这些都没有用到索引进行查询,用的是全表查询,查询的时候如果where条件没有最左边一列或者多列,索引就不会起作用
select * from aaa where column_1=‘a’ and column_3=‘a’
只用到了column_1的索引,column_3的索引没有用到,因为column_1, column_2, column_3是连续索引,只有三个是连续的时候才是引用了整个复合索引
即:select * from aaa where column_1=‘a’ and column_2=‘a’ and column_3=‘a’

再如使用了不等号,or,或者函数
select * from aaa where column_1=‘a’ and column_2 < 3 and column_3=‘a’
select * from aaa where column_1=‘a’ and column_2 = 3 or column_3=‘a’
select * from aaa where column_1=‘a’ and column_2 = DATE(‘xxx’) and column_3=‘a’
只会用到column_1, column_2,的索引,column_3的索引使用不到

强制使用索引a:select * from t force index(a) where a > 1


http://lihuaxi.xjx100.cn/news/1886162.html

相关文章

关于代码质量度量和分析的一些总结

最近团队做CMMI3认证&#xff0c;这期间涉及到了代码质量度量。花了点时间做了总结&#xff0c;分享给大家。 先看一张整体的图&#xff0c;然后逐个指标展开说明。 一、单元测试覆盖率 单元测试覆盖率&#xff08;Coverage&#xff09;是一个度量单元测试覆盖了多少代码的指标…

java面试题-线程、线程池的了解及工作原理、拒绝策略

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 这篇还蛮好理解的&…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

AI日报:苹果为使用Mac的人工智能开发者推出开源工具

文章目录 总览主要介绍开发理念开发细节MLX功能用途 MLX可以用于商业软件吗&#xff1f; 总览 苹果正在为开发人员提供新的工具&#xff0c;用于在其硬件上训练和运行大型语言模型。 主要介绍 开发理念 苹果公司通过发布一系列新的开源人工智能工具&#xff0c;向开源人工智能…

最大公约数gcd的通俗理解和Java代码的实现

最大公约数 什么是最大公约数最大公约数的计算练习&#xff08;找出数组的最大公约数&#xff09; 什么是最大公约数 最大公约数&#xff08;Greatest CommonDivisor&#xff0c;简称GCD&#xff09;是指两个或多个整数共有的最大正因数&#xff0c;即能够同时整除这些数的最大…

BigDecimald简单使用

为什么要用BigDecimal运算 在计算浮点型数据时,往往会存在数据计算失真问题 例1 2.0 - 1.9 应该等于0.1,用float类型赋值运算得出的结果为0.100000024,有问题 例2 1.8 - 1.9 应该等于 -0.1,用double类型赋值得出的结果为-0.09999999999999987,明显有问题 BigDecimal使用 BigDec…

Helm 包管理器

一、什么是 Helm&#xff1f; Kubernetes 包管理器 Helm 是查找、分享和使用软件构件 Kubernetes 的最优方式。Helm 管理名为 chart 的 Kubernetes 包的工具。Helm 可以做以下的事情&#xff1a; 从头开始创建新的 chart 将 chart 打包成归档(tgz)文件 与存储 chart 的仓库进行…

Next.js中的App Router与Page Router,各自的作用和使用方式,如何理解和配置使用?

App Router介绍 Next.js中的App Router是全局的路由器&#xff0c;它用于在应用程序的所有页面之间进行导航。它可以用于在页面之间传递状态和数据&#xff0c;类似于React中的Context。 App Router是通过_app.js文件中的getInitialProps方法来配置的。 在 Next.js 中&#xf…