mysql学习教程,从入门到精通,SQL 创建索引(CREATE INDEX 语句)(35)
1、SQL 创建索引(CREATE INDEX 语句)
在SQL中,创建索引(CREATE INDEX)是一种用于提高数据库查询性能的方法。索引类似于书的目录,通过它可以更快地定位到表中的特定行。以下是一个创建索引的示例,以及对其各部分的解释。
假设我们有一个名为 employees 的表,表结构如下:
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,hire_date DATE
);
我们希望在 last_name 列上创建一个索引,以便更快地执行基于姓氏的查询。以下是创建索引的SQL语句:
CREATE INDEX idx_last_name
ON employees (last_name);
解释
CREATE INDEX:这是创建索引的SQL命令。idx_last_name:这是索引的名称。在创建索引时,为其指定一个有意义的名称是一个好习惯,这有助于在将来管理索引。ON employees (last_name):这指定了索引要创建的表和列。在这个例子中,索引将创建在employees表的last_name列上。
创建复合索引
有时,你可能希望在一个或多个列上创建复合索引,以优化涉及这些列的多个列的查询。例如,我们希望在 last_name 和 first_name 列上创建一个复合索引:
CREATE INDEX idx_full_name
ON employees (last_name, first_name);
创建唯一索引
如果你希望确保列中的值是唯一的,可以创建唯一索引。例如,我们希望在 employee_id 列上创建一个唯一索引(虽然在这个例子中 employee_id 已经是主键,自然唯一,但这里仅作为示例):
CREATE UNIQUE INDEX idx_unique_employee_id
ON employees (employee_id);
创建索引时的注意事项
- 性能:虽然索引可以显著提高查询性能,但它们也会增加插入、更新和删除操作的成本,因为数据库需要维护索引。
- 空间:索引会占用额外的存储空间。
- 选择性:索引在选择性高的列上更有效。选择性是指列中不同值的数量与总行数之比。例如,性别列(只有“男”和“女”两个值)的选择性较低,而身份证号列的选择性较高。
当然可以,以下是几个使用CREATE INDEX语句创建索引的具体案例:
案例一:创建普通索引
假设我们有一个名为students的表,包含以下字段:student_id(学生ID)、first_name(名字)、last_name(姓氏)、grade(年级)和enrollment_date(入学日期)。我们希望在last_name字段上创建一个索引,以便加快基于姓氏的查询速度。
CREATE INDEX idx_last_name
ON students (last_name);
案例二:创建复合索引
现在,我们希望在students表上创建一个复合索引,以便能够同时加快基于姓氏和名字的查询速度。复合索引是在多个字段上创建的索引,当查询条件包含这些字段时,数据库可以利用复合索引来提高查询性能。
CREATE INDEX idx_full_name
ON students (last_name, first_name);
案例三:创建唯一索引
假设我们有一个名为courses的表,包含以下字段:course_id(课程ID)、course_name(课程名称)和course_code(课程代码)。我们希望确保course_code字段中的值是唯一的,因此可以在该字段上创建一个唯一索引。
CREATE UNIQUE INDEX idx_unique_course_code
ON courses (course_code);
唯一索引不仅提高了查询性能,还确保了数据的唯一性。如果尝试插入一个已经存在的course_code值,数据库将拒绝该操作并返回错误。
案例四:在大数据表上创建索引
假设我们有一个名为orders的表,该表包含大量的订单数据,并且我们经常需要基于customer_id和order_date字段来查询订单。为了提高查询性能,我们可以在这两个字段上创建一个复合索引。
CREATE INDEX idx_customer_order_date
ON orders (customer_id, order_date);
这个复合索引将帮助数据库更快地定位到特定客户的订单,特别是当查询条件同时包含customer_id和order_date字段时。
注意事项
- 索引的选择性:索引在选择性高的列上更有效。选择性是指列中不同值的数量与总行数之比。例如,在性别列上创建索引可能并不是一个好的选择,因为性别列通常只有几个不同的值(如“男”和“女”)。
- 索引的维护成本:虽然索引可以显著提高查询性能,但它们也会增加插入、更新和删除操作的成本。因为数据库需要在这些操作发生时维护索引。
- 索引的数量:过多的索引可能会导致性能问题。每个索引都需要占用额外的存储空间,并且在插入、更新和删除操作时都需要进行维护。因此,应该根据实际需求合理创建索引。
通过以上案例,我们可以看到CREATE INDEX语句在优化数据库查询性能方面的重要作用。在实际应用中,应该根据具体的查询需求和数据特点来选择合适的索引类型和字段。
以下是一些实际的SQL创建索引的案例,这些案例基于不同的数据库表和查询需求,展示了如何使用CREATE INDEX语句来优化查询性能。
案例一:在员工表上创建索引
假设我们有一个名为employees的表,该表存储了公司的员工信息。我们经常在last_name和department_id字段上进行查询,因此希望在这两个字段上创建索引。
-- 在last_name字段上创建普通索引
CREATE INDEX idx_employees_last_name
ON employees (last_name);-- 在department_id字段上创建普通索引
CREATE INDEX idx_employees_department_id
ON employees (department_id);
-- 或者,我们可以创建一个复合索引,以同时优化基于last_name和department_id的查询
CREATE INDEX idx_employees_last_name_department_id
ON employees (last_name, department_id);
案例二:在订单表上创建索引
假设我们有一个名为orders的表,该表存储了公司的订单信息。我们经常在customer_id、order_date和status字段上进行查询和过滤,因此希望在这些字段上创建索引。
-- 在customer_id字段上创建普通索引
CREATE INDEX idx_orders_customer_id
ON orders (customer_id);
-- 在order_date字段上创建普通索引
CREATE INDEX idx_orders_order_date
ON orders (order_date);-- 在status字段上创建普通索引(如果status字段的选择性较高)
CREATE INDEX idx_orders_status
ON orders (status);-- 或者,我们可以根据查询需求创建复合索引
-- 例如,优化基于customer_id和order_date的查询
CREATE INDEX idx_orders_customer_id_order_date
ON orders (customer_id, order_date);
案例三:在商品表上创建唯一索引
假设我们有一个名为products的表,该表存储了公司的商品信息。我们希望确保每个商品的product_code是唯一的,因此可以在该字段上创建唯一索引。
-- 在product_code字段上创建唯一索引
CREATE UNIQUE INDEX idx_products_unique_product_code
ON products (product_code);
案例四:在文章表上创建全文索引
假设我们有一个名为articles的表,该表存储了公司的文章信息。我们经常需要在文章的content字段中进行全文搜索,因此可以在该字段上创建全文索引(注意,全文索引的创建方式可能因数据库系统而异,以下以MySQL为例)。
-- 在MySQL中创建全文索引(需要确保数据库和表支持全文索引功能)
CREATE FULLTEXT INDEX idx_articles_fulltext_content
ON articles (content);
注意事项
- 索引的选择性:索引在选择性高的列上更有效。选择性是指列中不同值的数量与总行数之比。例如,在性别或布尔类型的列上创建索引可能并不是一个好的选择,因为这些列的选择性通常很低。
- 索引的维护成本:虽然索引可以显著提高查询性能,但它们也会增加插入、更新和删除操作的成本。因为数据库需要在这些操作发生时维护索引。因此,在创建索引时,需要权衡查询性能和数据维护成本。
- 索引的数量:过多的索引可能会导致性能问题。每个索引都需要占用额外的存储空间,并且在插入、更新和删除操作时都需要进行维护。因此,应该根据实际需求合理创建索引。
以上案例展示了如何在不同的数据库表和字段上创建索引,以优化查询性能。在实际应用中,应该根据具体的查询需求和数据特点来选择合适的索引类型和字段。
相关文章:
mysql学习教程,从入门到精通,SQL 创建索引(CREATE INDEX 语句)(35)
1、SQL 创建索引(CREATE INDEX 语句) 在SQL中,创建索引(CREATE INDEX)是一种用于提高数据库查询性能的方法。索引类似于书的目录,通过它可以更快地定位到表中的特定行。以下是一个创建索引的示例,以及对其各部分的解释…...
Pikachu-Cross-Site Scripting-DOM型xss_x
查看代码,输入的内容,通过get请求方式,用text 参数带过去; 获取text内容,赋值给xss 然后拼接到 dom 里;构造payload的关键语句: <a href"xss">就让往事都随风,都随风吧</a&…...
Pikachu-Cross-Site Scripting-xss之htmlspecialchars
首先输入各种字符 查看页面元素,可以看到这里对一些符号做了转换,但是 单引号等几个符号没处理; 从代码上看;使用单引号做闭合; 构造payload a onclickalert(11) 提交,得到xss攻击...
CSS基础中padding详解
文章目录 CSS基础中padding详解一、引言二、Padding基础1、Padding属性1.1、Padding的四个方向 2、Padding的值类型3、代码示例 三、Padding简写方法1、简写顺序2、简写规则3、代码示例 四、Padding对元素大小的影响1、解决方案1.1、Box-sizing属性1.2、计算实际宽度 五、总结 …...
OpenGL笔记十九之相机系统
OpenGL笔记十九之相机系统 —— 2024-10-02 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十九之相机系统1.运行1.1.游戏相机1.2.轨迹球相机 2.游戏相机与轨迹球相机切换3.博主笔记本要运行需要更改的文件更改1:28_OpenGL_CameraSystem/applicat…...
P-Tuning v2:一种普遍有效的提示调整方法
人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型通过微调(fine-tuning)来适应特定任务虽然效果显著,但存在训练成本高、参数存储量大等问题。为了解决这些问题,清华大学的研究者们提出了一种名为P-Tuning v2的提示调整&am…...
微信小程序启动不起来,报错凡是以~/包名/*.js路径的文件,都找不到,试过网上一切方法,最终居然这么解决的,【避坑】命运的齿轮开始转动
app.json "resolveAlias": {"~/*": "/*"},文件代码也没有问题,网上的方法试过来了,大模型AI也问过遍,熬夜到凌晨2点半,最不可思议的是居然是因为微信开发者工具版本的问题,我真的是笑死…...
C#串口温度读取
背景:每天学点,坚持 要安装好虚拟串口和modbus poll,方便调试(相关资源在文末,也可以私信找我要) 传感器部分使用的是达林科技的DL11B-MC-D1,当时42软妹币买的(官网上面有这个传感…...
2.5 Spring Boot整合Spring MVC框架
今天,我将向大家介绍如何在Spring Boot中整合Spring MVC框架,并展示如何创建和测试控制层(Controller)。 首先,让我们简要回顾一下Spring MVC。Spring MVC是一个基于Servlet的MVC框架,它简单、侵入性小&am…...
Java 归并排序
归并排序(Merge Sort)是一种基于分治法的排序算法。它将一个大数组分成两个较小的子数组,分别对每个子数组进行排序,然后再将这两个已排序的子数组合并成一个完整的已排序数组。归并排序的时间复杂度为 O(n log n),其中…...
20241008深度学习动手篇
文章目录 1.如何写一个神经网络进行训练?1.1创建一个子类,搭建你需要的神经网络结构1.2 加载数据集1.3 自定义一些指标评估函数1.4训练1.5 结果展示 2.参考文献 1.如何写一个神经网络进行训练? 1.1创建一个子类,搭建你需要的神经网络结构 # File: 241008LeNet.py # Author:…...
对序列化反序列化在项目中的使用优化
文章目录 序列化是什么?常见的序列化协议使用序列化反序列化序列化List反序列化List 查看源码,分析不足进行改善 序列化是什么? 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,…...
查看 git log的过程中看到 :说明日志输出可能超出屏幕大小,系统进入了分页模式
在命令行提示符中,通常 : 表示系统等待进一步的输入。如果你在查看 git log 的过程中看到 :,说明日志输出可能超出屏幕大小,系统进入了分页模式,默认使用 less 命令查看内容。 此时你可以: 按 q 退出日志查看。按 En…...
Linux--信号量详解
目录 一、信号量 1、信号量相关函数 2、多线程环形队列生产消费模型 3、实现代码 信号量是将整体的资源分割成多份使用 信号量本质是对资源的预定机制 一、信号量 1、信号量相关函数 创建信号量: sem_init: int sem_init(sem_t *sem, int pshared, unsigned int value); …...
【重学 MySQL】五十一、更新和删除数据
【重学 MySQL】五十一、更新和删除数据 更新数据删除数据注意事项 在MySQL中,更新和删除数据是数据库管理的基本操作。 更新数据 为了更新(修改)表中的数据,可使用UPDATE语句。UPDATE语句的基本语法如下: UPDATE ta…...
Web3与人工智能的交叉应用探索
随着数字技术的发展,Web3与人工智能(AI)之间的结合正逐渐成为一个重要的研究领域。Web3技术旨在实现更加去中心化和透明的互联网,而人工智能则在数据分析、自动化决策和增强人类能力方面展示了巨大的潜力。 1. 去中心化数据管理与…...
【springboot9736】基于springboot+vue的逍遥大药房管理系统
作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 伴随着全球信息化发展,行行业业都与计算机技…...
四.网络层(上)
目录 4.1网络层功能概述 4.2 SDN基本概念 4.3 路由算法与路由协议 4.3.1什么是路由协议? 4.3.2什么是路由算法? 4.3.3路由算法分类 (1)静态路由算法 (2)动态路由算法 ①全局性 OSPF协议与链路状态算法 ②分散性 RIP协议与距离向量算法 4.3.…...
Leecode热题100-56.合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,3…...
安全帽未佩戴预警系统 劳保防护用品穿戴监测系统 YOLO
在建筑、矿山、电力等高危行业中,工人面临着各种潜在的危险,如高空坠物、物体打击等。安全帽能够有效地分散和吸收冲击力,大大降低头部受伤的严重程度。一旦工人未正确佩戴安全帽,在遭遇危险时,头部将直接暴露在危险之…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
