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
在建筑、矿山、电力等高危行业中,工人面临着各种潜在的危险,如高空坠物、物体打击等。安全帽能够有效地分散和吸收冲击力,大大降低头部受伤的严重程度。一旦工人未正确佩戴安全帽,在遭遇危险时,头部将直接暴露在危险之…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
