MySQL索引使用总结

索引(index)

官方定义:一种提高MySQL查询效率的数据结构
优点:加快查询速度
缺点:
1.维护索引需要消耗数据库资源
2.索引需要占用磁盘空间
3.增删改的时候会影响性能

索引分类

索引和数据库表的存储引擎有关,不同的存储引擎,表的存储方式是不同的,这也就导致应用索引的时候有所不同,具体可以参考:https://blog.csdn.net/weixin_42209881/article/details/134660475
以InnoDB引擎为例,共有以下几种索引:
主键索引:建表时设置主键时,数据库会自动建立索引。

单值索引(单列索引,普通索引):一个索引只包含单个列,一个表可以有多个单值索引。关键字NORMAL

唯一索引:索引列的值必须唯一,但允许为null,这也是和主键索引的区别。关键字 UNIQUE

复合索引:多个列组合在一起,共同创建一个索引。

全文(Full text)索引:MySQL5.7的版本之前,只支持MYISAM引擎,之后的支持InnoDB引擎。在定义索引的列上支持全文查找,允许这些索引列中插入重复值和空值。可以在(char,varchar,text)这些列上创建,关键字FULLTEXT

空间索引:MySQL5.7的版本之前,也是只支持MYISAM引擎,之后的支持InnoDB引擎。是对空间数据类型的字段建立的索引,MySQL 中的空间数据类型有 4 种:geometry(几何体)、point(点)、linestring(线)、polygon(多边形)。创建空间索引的列,必须将其声明为 not null。关键字SPATIAL
在这里插入图片描述

创建索引

主键索引不用创建,在建表之后,会自动创建一个索引
比如通过这个sql查询一下索引

show  index  from device_info

在这里插入图片描述
普通索引可以建表的时候创建,也可以用sql创建,

CREATE TABLE tableName( age INT NOT NULL,  columnName  columnType,INDEX [indexName] (columnName(length)) 
);
CREATE INDEX indexName ON tableName (columnName(length))
ALTER TABLE tableName ADD INDEX indexName(columnName)

通用语法:

ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
[index_name] (col_name[length],...) [ASC | DESC]
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (col_name[length],...) [ASC | DESC]  
  • UNIQUE 、FULLTEXT 和SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
  • INDEX 与KEY 为同义词,两者的作用相同,用来指定创建索引;
  • index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
  • col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
  • length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
  • ASC 或DESC 指定升序或者降序的索引值存储。
    复合索引创建:
CREATE TABLE test3(id INT(11) NOT NULL,name CHAR(10) NOT NULL,age INT(5) NOT NULL,INDEX mulindex(id,age)
)

索引的使用原则

  • 索引并非越多越好
    由于当表中的数据更改的同时,索引也会进行调整和更新,并且会影响插入和更新所以索引并非越多越好。

  • 避免对经常更新的表进行过多的索引
    避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对于经常用于查询的字段应该创建索引,但要避免添加不必要的字段。

  • 数据量小的表最好不要使用索引
    数据量小,不影响性能时,就不要使用索引了,有可能造成相反的结果。

  • 尽量选择区分度高的列作为索引,在不同值较多的列上建立索引,不同值很少的列上不要建索引

  • 当唯一性是某种数据本身的特征时,指定唯一索引
    使用唯一索引须能确保定义的列的数据完整性,以提高查询速度。

  • 在频繁进行排序或分组的列上建立索引
    在频繁进行 group by 或 order by 操作的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

  • 尽量的扩展索引,不要新建索引。

  • 比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

注意事项

索引有个最左前缀匹配原则,在使用复合索引时,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
并且 “=” 和 “in” 在使用 and 时可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的内部的查询优化器会自动进行优化,匹配索引

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

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

相关文章

探索Python内置类属性__repr__:展示对象的魅力与实用性

概要 在Python中&#xff0c;每个对象都有一个内置的__repr__属性&#xff0c;它提供了对象的字符串表示形式。这个特殊的属性在调试、日志记录和交互式会话等场景中非常有用。本文将详细介绍__repr__属性的使用教程&#xff0c;包括定义、常见应用场景和注意事项&#xff0c;…

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号&#xff0c;俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

Vue实现可拖拽边界布局

Vue实现可拖拽边界布局 在前端开发中&#xff0c;有时需要实现一种可拖拽边界的布局&#xff0c;通过拖动分隔线来调整不同区域大小。例如&#xff0c;下图是一个典型的可拖拽边界布局&#xff0c;它由左右两个区域组成&#xff0c;左边是一个树形菜单&#xff0c;右边是一个上…

如何用眼精星票证识别系统识别名片?

近年来&#xff0c;随着信息化技术的不断发展&#xff0c;越来越多的人开始使用电子名片来进行商务交流和信息传递。然而&#xff0c;如何将纸质名片转化为电子名片并结构化数据&#xff0c;却一直是许多人的难题。本文将介绍一种使用眼精星票证识别系统的方法&#xff0c;将纸…

C++ day42背包理论基础01 + 滚动数组

背包问题的重中之重是01背包 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态&#xff0c;取或者不…

springboot2.0 集成swagger3+Knife4j导出离线API 配置

springboot 版本2.3.1 一、集成swagger3 引入swagger依赖包 <!--swagger3集成--><dependency><groupId>org.springframework.plugin</groupId><artifactId>spring-plugin-core</artifactId><version>2.0.0.RELEASE</version>…

Mysql单表查询练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10…

为什么Redis这么快?5分钟成为Redis高手

Redis简介 Redis 是 C 语言开发的一个开源高性能键值对的内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件等场景&#xff0c;是一种 NoSQL&#xff08;not-only sql&#xff0c;非关系型数据库&#xff09;的数据库。 Redis特点 优秀的性能&#xff0c;数据是存储…

Java 数据结构篇-实现双链表的核心API

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 双链表的说明 1.1 双链表 - 创建 1.2 双链表 - 根据索引查找节点 1.3 双链表 - 根据索引插入节点 1.4 双链表 - 头插节点 1.5 双链表 - 尾插 1.6 双链表 - 根据索引来…

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)

Linux系统安装Docker-根据官方教程教程&#xff08;以Ubuntu为例&#xff09; 1. 背景介绍2. 环境配置2.1 软件环境要求2.2 软件下载2.3 文档地址2.3 必备命令工具下载 3. 安装Docker3.1 使用root用户操作后续命令3.2 卸载可能存在的旧版本 4. 安装Docker4.1 更新依赖包4.2 配置…

Spark---SparkCore(四)

三、Spark Master HA 1、Master的高可用原理 Standalone集群只有一个Master&#xff0c;如果Master挂了就无法提交应用程序&#xff0c;需要给Master进行高可用配置&#xff0c;Master的高可用可以使用fileSystem(文件系统)和zookeeper&#xff08;分布式协调服务&#xff09…

elasticsearch 实战

文章目录 项目介绍导入项目 Elasticsearch Java API 查询文档快速入门发起查询请求解析响应完整代码 match查询精确查询布尔查询排序、分页高亮高亮请求构建高亮结果解析 项目介绍 本项目是一个由spring boot 3.0.2在gradle 8.4和java 21的环境下搭建的elasticsearch项目demo&…