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
在建筑、矿山、电力等高危行业中,工人面临着各种潜在的危险,如高空坠物、物体打击等。安全帽能够有效地分散和吸收冲击力,大大降低头部受伤的严重程度。一旦工人未正确佩戴安全帽,在遭遇危险时,头部将直接暴露在危险之…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
