MySQL数据库中的索引知识

2024-06-22 22:36

本文主要是介绍MySQL数据库中的索引知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL数据库中索引的作用是用来加快数据的查询速度。

索引  index(表的层面)

在数据库中使用select来查询数据的时候会一条一条得去查询符合要求的数据,而索引就相当于在这张表中依据某一个字段的数值给这张表的数据创建了一个目录。目录帮助我们快速的去定位数据。

在表中创建索引的时候要挑选合适的字段来创建索引,如果为这张表创建的索引挑选的字段不合适的话,此时依据索引查询数据的速度不增反降。

如上图所示,在实际应用场景中我们需要依据一段时间之内用户的行为来将合适的字段创建索引。

如果说在一段时间以内,用户常常根据商品的价格来搜索商品,此时我们就需要将这张表的索引创建在价格从字段上。此时数据库会自动按照价格的数值来进行相应的排序,然后生成一个目录。

如果用户的搜索行为发生改变的话,此时我们就需要将原来表中的索引删除,重新创建一个索引。

在创建索引的时候不适合将索引创建在数据经常需要发生变动的字段上。

注意点:1.不适合在经常变动的数据上建立索引。

2.建立在合适的字段上{根据前端业务的用户行为}

MySQL数据库默认会在主键字段上自动创建索引,

查看表的索引

如上图所示,在MySQL数据库中使用SQL语句show index from 表的名称;

来查看这张表的索引,此时MySQL数据库软件会给出一个表,在这张表中有一行内容就代表有一个索引,一般在MySQL数据库中都会有这样一个默认行为即自动为拥有主键属性的字段去创建索引。

创建索引

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option] ...

如上图所示,是使用help create index;在MySQL数据库上去查询如何创建索引的SQL语句。

即如果想去在一张表的某一个字段上去创建索引,就需要使用语句

create index 自己起的索引名称

on 表的名称(表的字段名称,表的字段名称);

如上图所示,在使用show index from 表名称;的表格中的key_name是索引的名称。

如上图所示,使用SQL语句create index 创建的索引名称 on 表的名称 (字段名称);

可以在表中创建索引,使用show index from 表的名称;

在日常工作中,MySQL数据库工作人员常常使用字段_key的方式来为创建的索引命名。

删除索引

如上图所示,使用命令drop index 索引名称 on 表名称

验证索引对加快搜索数据的帮助

在MySQL内部有一个查询分析器的东西。这个查询分析器可以帮助我们分析select语句是如何帮助获取到数据的。

explain就是MySQL中的查询分析器。

如上图所示,key的结果可以说明在使用select语句查询表中信息的时候是否使用到了索引,当为null的时候表示没有使用到索引。而rows表示使用select语句调查表中的信息的时候调查了表的多少行数据。

如上图所示,当在表中使用语句create index 索引名称 on 表(字段名称);

使用explain select * from 表名称 where 条件;

可以查看到select语句的执行过程。

什么情况下的select语句是不能触发字段的索引的?

当你写的select语句触发了数据类型转换的时候,就不能触发索引。

如上图所示,当使用select语句中使用了比较查询的时候,或者在等值查询的时候使用了“5000”这种将字符串=数字,的数据类型转换的时候同样不能触发索引。

在SQL语句中使用select语句去查询数据的时候什么情况是用不到索引的?

在使用SQL的SELECT语句查询数据时,以下情况可能不会使用索引,从而可能影响查询性能:

  1. 全表扫描更快: 当表中的数据量非常小,全表扫描比使用索引进行查找更快时,数据库可能选择不使用索引。

  2. 使用函数或表达式: 在查询条件中,如果对索引列使用了函数、表达式或计算(如DATE(create_time)age - 1),这通常会导致索引失效。

  3. 不等于(!=)和NOT IN操作符: 使用!=NOT IN操作符可能导致索引不被使用,特别是当这些操作符与其他条件结合使用时。

  4. 类型不匹配: 如果查询条件中的数据类型与索引列的数据类型不一致,可能导致索引失效。

  5. LIKE操作符以通配符开头: 如果LIKE子句以通配符(如'%abc')开头,索引通常不会被利用,因为这要求对列的每一项做全值比较。

  6. OR条件: 当查询条件中包含多个通过OR连接的条件时,除非每个条件的列都有索引且优化器选择使用这些索引,否则索引可能不会被利用。

  7. 多列索引未使用第一列: 对于复合索引(多列索引),如果查询条件没有首先使用索引的第一列,索引可能不会被使用。

  8. 索引列参与计算: 在条件中,如果对索引列进行了数学运算(+,-,*,/,!)或其他计算,索引可能不会被使用。

  9. 字段编码不一致: 在关联查询中,如果关联字段的字符编码不一致,可能导致索引失效。

  10. 索引覆盖未满足: 如果查询需要从表中检索大量数据,而不仅仅是索引包含的列(即没有实现索引覆盖),数据库可能决定放弃使用索引而进行全表扫描。

了解这些情况有助于在设计查询和索引策略时做出更优化的选择,以提高查询效率。

这篇关于MySQL数据库中的索引知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085601

相关文章

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE