Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
mysql如何添加主键索引 mysql创建主键索引的步骤详解_创想鸟

mysql如何添加主键索引 mysql创建主键索引的步骤详解

mysql中添加主键索引主要有三种方式:1. 创建新表时直接添加主键,可在列定义后使用primary key或在所有列定义后单独声明;2. 在已有表上通过alter table添加主键,需确保目标列非空且唯一,必要时先清洗数据;3. 添加复合主键,适用于多列组合才能唯一标识记录的情况。主键索引在innodb中为聚簇索引,决定了数据的物理存储顺序,能显著提升查询性能,但插入随机主键(如uuid)可能导致性能下降。自增id作为主键通常更优。在大表上添加主键会面临锁表、耗时和磁盘空间问题,可通过在线ddl、选择低峰期操作、测试备份及监控应对。单一主键简洁高效,适合大多数场景;复合主键反映业务逻辑唯一性,但索引体积大、查询受限,外键引用也较复杂,应根据业务需求和查询模式权衡选择。

mysql如何添加主键索引 mysql创建主键索引的步骤详解

MySQL中添加主键索引,通常是在创建表时直接声明,或者在已有表上通过ALTER TABLE语句来完成。这不仅仅是为了一项技术上的“配置”,更是为了确保数据记录的唯一性,同时,它对数据库查询性能的提升是相当显著的,几乎可以说是核心优化手段之一。

mysql如何添加主键索引 mysql创建主键索引的步骤详解

解决方案

1. 创建新表时直接添加主键:这是最常见也最推荐的方式。在定义列的时候,直接用PRIMARY KEY关键字指定。

CREATE TABLE users (    user_id INT AUTO_INCREMENT PRIMARY KEY, -- 这样就直接把user_id设为主键了,还带了自增属性    username VARCHAR(50) NOT NULL UNIQUE,    email VARCHAR(100),    registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

或者,如果你觉得在列定义后面直接跟PRIMARY KEY看起来有点乱,也可以在所有列定义之后,单独声明主键:

mysql如何添加主键索引 mysql创建主键索引的步骤详解

CREATE TABLE products (    product_id INT,    product_name VARCHAR(255) NOT NULL,    price DECIMAL(10, 2),    PRIMARY KEY (product_id) -- 在表定义末尾指定主键);

2. 在已有表上添加主键:当你有一张已经存在但没有主键的表时,可以利用ALTER TABLE语句来添加。不过,这里有个重要的前提:你选择作为主键的列(或列组合)必须满足两个条件——所有值非空(NOT NULL)且所有值唯一(UNIQUE)。如果现有数据不满足,你需要先清洗数据。

-- 假设你有一张名为 'orders' 的表,里面有 'order_id' 列,你想把它设为主键-- 首先,确保 'order_id' 列是非空且唯一的,如果不是,可能需要先更新或修改列属性ALTER TABLE ordersMODIFY order_id INT NOT NULL UNIQUE; -- 这一步可能需要,如果order_id本来允许NULL或者有重复值-- 然后,添加主键ALTER TABLE ordersADD PRIMARY KEY (order_id);

3. 添加复合主键:有时候,单一列无法唯一标识一条记录,需要多列组合起来才能。这时,你可以创建复合主键。

mysql如何添加主键索引 mysql创建主键索引的步骤详解

-- 假设有一个订单明细表,一个订单可以有多个商品,每个商品的行由 order_id 和 item_id 共同确定ALTER TABLE order_detailsADD PRIMARY KEY (order_id, item_id); -- order_id 和 item_id 的组合作为主键

MySQL主键索引的底层原理与性能考量是什么?

说到主键索引,我们其实在谈论MySQL里InnoDB存储引擎的“核心”。它和我们平时理解的普通索引(二级索引)有点不一样。在InnoDB里,主键索引是所谓的聚簇索引(Clustered Index)。这意味着什么呢?简单来说,你的表数据在磁盘上物理存储的顺序,就是按照主键的顺序来排列的。想象一下,一本书的目录(索引)和书的内容是分开的,但如果这本书的内容本身就是按照目录的顺序一页页排好的,那查找起来是不是快多了?聚簇索引就是这个意思。

所以,当通过主键进行查询时,数据库可以直接定位到数据行所在的物理位置,避免了额外的磁盘寻道,性能自然是顶级的。这对于像WHERE id = 123这样的精确查找,或者WHERE id BETWEEN 100 AND 200这样的范围查询,都有巨大的优势。

但凡事都有两面性。由于数据是按照主键顺序物理存储的,那么插入新数据时,如果主键值是随机的(比如用UUID作主键),数据库可能需要不断地调整数据文件的物理顺序,这会引发大量的随机I/O,性能反而会下降。这就是为什么我们常说,自增ID(AUTO_INCREMENT)作为主键是个非常好的选择,因为它保证了插入的顺序性,能有效减少页分裂和随机I/O,提升插入性能。我个人在设计表的时候,几乎都会优先考虑一个自增整数作为主键,除非业务上真的有非常特殊的、非自增主键不可的需求。

在已有大量数据的表上添加主键索引会遇到哪些挑战?

在已经有大量数据的表上添加主键,这可不是一个可以掉以轻心的小操作。它通常会带来几个明显的挑战:

首先是锁表问题。在MySQL 5.6及更早的版本中,执行ALTER TABLE ... ADD PRIMARY KEY这样的DDL(数据定义语言)操作,可能会对表施加一个全局锁(MDL锁,Metadata Lock),这意味着在DDL操作完成之前,对该表的所有读写操作都会被阻塞。对于生产环境中的大表,这意味着你的业务可能会中断数分钟、数小时甚至更久,这是不可接受的。

其次是操作耗时。由于主键索引的聚簇特性,添加主键通常意味着MySQL需要重建整个表。它会创建一个新的临时表,将原表的数据按照主键顺序复制到新表中,然后删除旧表,重命名新表。这个过程涉及大量的数据复制和磁盘I/O,数据量越大,耗时越长。

再者是磁盘空间需求。重建表的过程中,你需要至少两倍于原表大小的空闲磁盘空间(一份原表数据,一份临时表数据)。如果磁盘空间不足,操作会失败。

那么,怎么应对这些挑战呢?

在线DDL (Online DDL):MySQL 5.6及更高版本引入了在线DDL特性,允许在执行ALTER TABLE时,尽可能减少对表操作的阻塞。通过指定ALGORITHM=INPLACELOCK=NONE(如果支持),可以在DDL操作进行的同时,允许DML(数据操作语言,如INSERT, UPDATE, DELETE)操作继续进行。虽然不是完全无锁,但大大降低了影响。

ALTER TABLE your_large_table ADD PRIMARY KEY (id), ALGORITHM=INPLACE, LOCK=NONE;

但即便如此,也并非所有操作都支持完全无锁,而且在DDL的最后阶段,仍然会有一个短暂的元数据锁。

选择业务低峰期操作:这是最直接也最稳妥的方法。在系统负载最低的时候执行DDL,可以最大限度地减少对用户的影响。充分的测试和备份:在生产环境执行前,务必在测试环境用接近生产的数据量进行充分测试,评估操作时长和可能的影响。同时,操作前务必进行全量备份,以防万一。监控和警报:在操作过程中,密切监控数据库的性能指标,如CPU、内存、磁盘I/O和锁等待,确保能及时发现并处理问题。

复合主键与单一主键在实际应用中如何权衡选择?

在数据库设计中,选择单一主键还是复合主键,确实是一个需要深思熟虑的问题,它关乎到数据模型的清晰度、查询效率和维护成本。

单一主键,通常是一个单独的列,比如我们最常用的自增整数ID。

优点简洁明了:一个ID就能唯一标识一条记录,无论是代码层面还是SQL查询都非常直观。查询效率高:由于只有一个列,索引结构相对简单,查找速度快。外键引用方便:其他表引用时,只需要引用一个列即可。空间占用相对小:索引存储空间更小。缺点:有时可能需要额外的唯一约束来保证业务逻辑上的唯一性(例如,用户表的用户名唯一)。

复合主键,顾名思义,是由多个列组合起来作为主键。例如,在一个订单明细表中,order_iditem_id的组合才能唯一标识一条记录。

优点天然的唯一性约束:它直接反映了业务逻辑上的唯一性,避免了数据冗余和不一致。减少冗余列:在某些情况下,可以避免为了单一主键而引入一个“无意义”的自增ID列。缺点索引体积增大:索引需要存储多列的值,占用更多磁盘空间。查询效率可能受限:只有当查询条件包含了复合主键的所有前缀列时,索引才能被高效利用。例如,PRIMARY KEY (col1, col2, col3)WHERE col1 = 'A'能用到索引,WHERE col2 = 'B'就用不到了。外键引用复杂:如果其他表需要引用这个复合主键,那么外键也需要由多个列组成,增加了复杂性。

权衡选择的考量点:

业务逻辑的唯一性:这是最重要的考量。如果业务上天然就需要多列组合才能唯一标识一条记录,那么复合主键是一个非常自然的选择。比如,在一个多对多关系表中(如学生-课程关系),学生ID课程ID的组合就是天然的主键。查询模式:你的应用主要会通过哪些列来查询数据?如果大部分查询都会涉及到复合主键的所有列,那么复合主键的性能表现会很好。如果经常只通过复合主键中的部分列进行查询,那么可能需要考虑额外的单一索引,或者重新评估主键设计。外键引用:如果这张表会被很多其他表引用,并且你希望外键关系清晰简洁,那么单一主键通常是更好的选择。数据量与性能预期:对于超大表,复合主键的索引体积和查询复杂性可能会对性能产生更显著的影响。

我的经验是,除非业务逻辑非常明确地要求复合主键,或者单一列无法保证唯一性,否则我倾向于使用一个简单的、自增的整数作为单一主键。这能让数据库设计更简洁,开发更方便,并且在大多数情况下能提供非常优秀的性能。如果需要保证多列的唯一性,可以考虑在单一主键的基础上,额外添加一个唯一索引来满足业务需求,这通常是更灵活且易于管理的方式。

以上就是mysql如何添加主键索引 mysql创建主键索引的步骤详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/25421.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
抖音来客上怎么修改个人简介?抖音来客如何编辑个人简介的步骤
上一篇 2026年9月22日 12:26:26
excel怎么把时间格式转换成数字_excel时间格式与数值格式相互转换
下一篇 2025年11月14日 10:41:20

相关推荐

  • PHP数组如何定义和使用_PHP数组定义与使用详细教程

    PHP数组是存储和管理多个值的核心工具,支持索引、关联、混合及多维结构;通过方括号定义,可灵活访问、修改、添加或删除元素,并利用foreach高效遍历。 PHP数组是存储一系列值的强大工具,无论这些值是简单的数据项,还是更复杂的结构。它的核心思想就是把一堆相关的数据“打包”在一起,通过一个统一的名字…

    2026年9月22日
    000
  • Java中递归处理列表:排序验证与条件性最大值移除策略

    在处理列表数据时,我们常遇到需要根据特定条件修改列表的需求。本教程将深入探讨一个具体的场景:如何设计一个递归函数,该函数首先判断一个整数列表是否已按升序排序。如果列表已排序,则停止处理;如果未排序,则进一步检查列表中的最大值。仅当最大值位于列表的起始位置或末尾时,才将其移除,并对修改后的列表重复此过…

    2026年9月22日
    000
  • VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​

    VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​

    在vscode中配置python虚拟环境的核心是选择正确的解释器,确保项目依赖隔离;2. 首先在项目根目录使用python -m venv .venv创建虚拟环境,或使用conda、pipenv等工具;3. 在vscode中打开项目文件夹,通过ctrl+shift+p输入“python: selec…

    2026年9月22日 用户投稿
    100
  • 逛京东先人一步下单E人E本EBOOK X14 Air笔记本 补贴立省10%

    逛京东先人一步下单E人E本EBOOK X14 Air笔记本 补贴立省10%逛京东先人一步下单E人E本EBOOK X14 Air笔记本 补贴立省10%逛京东先人一步下单E人E本EBOOK X14 Air笔记本 补贴立省10%逛京东先人一步下单E人E本EBOOK X14 Air笔记本 补贴立省10%

    10月13日10:00,京东抢先首发e人e本全新力作——ebook x14 air ai轻薄笔记本电脑,以仅898克的极致轻盈机身和卓越的本地ai算力,重新定义高效移动办公新标准。新品官方定价7999元,京东首发期间可享国家补贴直降10%,实付仅需7199元,晒单再赠50元京东e卡,下单即送高品质内…

    2026年9月22日 用户投稿
    000
  • 如何在mysql中开发库存盘点管理项目

    答案是设计合理的数据库结构并实现业务逻辑以确保库存数据准确。首先建立商品、仓库、库存、盘点单及明细表,通过外键关联保证数据完整性;接着实现创建盘点任务、加载系统库存、录入实际数量、计算差异并更新库存的流程,使用事务确保操作原子性;最后提供差异查询与报表功能,支持管理决策,从而构建稳定可靠的库存盘点系…

    2026年9月22日
    000
  • Pictory如何快速生成AI视频?从文本到AI视频的完整教程

    Pictory通过智能算法将文字脚本转化为专业AI视频,核心在于自动分析文本、匹配视觉素材、生成语音并初步剪辑。用户登录后选择“Script to Video”,粘贴结构清晰的脚本,AI会自动分割场景并推荐素材,支持手动调整场景划分、替换素材、上传自定义图片视频以增强品牌一致性。平台提供多语言AI语…

    2026年9月22日
    000
  • MySQL最新版本如何下载?官方下载指南

    MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南

    要下载mysql,推荐从官网直接下载;选择社区版或商业版取决于用途;下载时需选对操作系统和版本;安装遇到问题可查错误提示并搜索解决方案;验证安装成功可用命令行登录。下载步骤包括访问官网、选择版本与操作系统、使用installer、注册账号、开始下载安装。安装后配置root密码、字符集等。验证方式为命…

    2026年9月22日 用户投稿
    100
  • VSCode如何集成RabbitMQ管理工具 VSCode消息队列插件的使用指南

    vscode可通过安装benoit zuger开发的rabbitmq插件实现对rabbitmq的连接、消息查看、队列管理等操作;2. 使用步骤包括安装插件、添加连接、配置name、host、port、username、password和vhost参数;3. 连接成功后可在vscode内查看队列、发布…

    2026年9月22日
    000
  • 百家号发文章有字数要求吗?百家号文章最少多少字

    数字时代已经来临。百家号作为一款内容创作平台,成为了众多创作者展示才华、传播思想的舞台。百家号对于文章的字数要求,成为了许多创作者关注的焦点。本文将围绕百家号文章的字数要求,探讨其背后的原因、影响及应对策略。 一、百家号文章字数要求的原因 1. 提升内容质量 百家号对文章字数的要求,旨在提升内容质量…

    2026年9月22日
    100
  • Flyway多数据库与CI/CD测试集成策略

    本文深入探讨了在CI/CD流程中,如何高效地配置Flyway以管理多数据库环境下的迁移,尤其关注集成测试场景。我们将比较使用真实数据库服务、Testcontainers以及Flyway自身多数据库配置的优劣,并提供关于分离生产与测试环境迁移脚本的实用策略,旨在确保开发、测试与生产环境的数据一致性与流…

    2026年9月22日
    100
  • 华为:Pura 80 Ultra、Watch GT 6 Pro入选2025年度最佳发明

    10月25日消息,华为终端官微今日发布喜讯:pura 80 ultra与watch gt 6 pro成功入选《时代周刊》2025年度最佳发明榜单。 华为方面指出,Pura 80 Ultra凭借其在影像设计与技术创新方面的突破性表现,赢得权威认可。 WATCH GT 6 Pro则因出色的运动监测功能、…

    2026年9月22日
    000
  • Spring Boot自定义Kafka配置与动态Bean注册最佳实践

    本文探讨了在Spring Boot应用中通过自定义注解简化Kafka配置的挑战与解决方案。重点介绍了如何利用META-INF/spring.factories实现早期自动配置,并详细阐述了使用ImportBeanDefinitionRegistrar在应用上下文初始化早期动态注册Kafka生产者工厂…

    2026年9月22日
    100
  • iPhone 17邀请函暗藏玄机 博主:散热稳了

    8月27日消息,苹果新品发布会已确定于北京时间9月10日凌晨1点举行,有网友指出,苹果发布的宣传海报中,其logo呈现出类似热成像图的视觉效果,疑似暗示iphone 17系列将在散热方面迎来重大升级。 科技博主定焦数码分析称,发布会海报中橘红色的高温区域正逐步消散,这一视觉设计意在突出iPhone …

    2026年9月22日
    200
  • mysql安装后怎么维护 mysql日常维护操作大全

    mysql安装后怎么维护 mysql日常维护操作大全mysql安装后怎么维护 mysql日常维护操作大全mysql安装后怎么维护 mysql日常维护操作大全mysql安装后怎么维护 mysql日常维护操作大全

    开启并分析慢查询日志以优化 sql 性能;2. 定期使用逻辑或物理方式备份数据并异地存储;3. 监控连接数和服务器资源,防止资源耗尽;4. 定期执行 analyze、optimize 和 check 表操作以维护表健康;5. 合理管理日志配置与清理策略。mysql 安装后的日常维护主要包括慢查询监控…

    2026年9月22日 用户投稿
    100
  • 深度解析蝴蝶号如何实现AI实景24小时无人直播

    深度解析蝴蝶号如何实现AI实景24小时无人直播深度解析蝴蝶号如何实现AI实景24小时无人直播深度解析蝴蝶号如何实现AI实景24小时无人直播深度解析蝴蝶号如何实现AI实景24小时无人直播

    蝴蝶号能实现ai实景24小时无人直播,主要靠智能中控系统+实景画面采集+自动化互动机制。一、ai中控系统作为“大脑”,自动控制画面切换、语音播报、商品推荐和评论区互动,具备一定判断能力,确保稳定性与持续性。二、实景画面采集作为“眼睛”,通过高清摄像头和云台控制,在门店、仓库等场景采集实时画面,保障真…

    2026年9月22日 用户投稿
    200
  • 苹果手机锁屏信息如何设置在中间

    一、系统版本前提 想要调整苹果手机锁屏信息的显示位置,首先需要确认设备运行的是较新版本的 iOS 系统。通常情况下,iOS 的高版本系统会提供更丰富的自定义功能,为实现锁屏内容居中显示打下基础。 二、基础设置路径 进入手机主界面,打开“设置”应用。在设置列表中找到“显示与亮度”并点击进入。此页面包含…

    2026年9月22日
    700
  • 在Java中如何开发简易问答社区

    答案是Java结合Spring Boot可快速构建问答社区,通过设计questions、answers、users三张表实现数据存储,使用JPA进行持久化,前端用HTML+JS调用后端API完成用户提问、回答、查看与互动功能。 开发一个简易问答社区,核心是实现用户提问、回答、查看问题和互动功能。Ja…

    2026年9月22日
    100
  • PHP 数组元素按日期条件过滤与删除:避免常见陷阱

    本教程详细介绍了如何在 PHP 中根据日期条件动态删除数组(或对象数组)中的元素。文章将重点讲解如何正确进行日期比较,特别是当数据源为 JSON 格式时,以及 unset 函数在遍历过程中移除元素时的正确用法,帮助开发者避免常见的字符串日期比较和对象属性访问错误。 简介 在数据处理中,根据特定条件过…

    2026年9月22日
    100
  • HitPawVideoEditor如何制作AI视频?教你快速创建AI内容的步骤

    答案是HitPaw Video Editor通过AI文本转视频、AI图片生成、智能抠图、自动字幕等功能,显著提升视频创作效率。它以“AI创作+人工精修”模式降低制作门槛,帮助用户快速生成初稿、丰富视觉素材、简化复杂操作,并支持快速迭代,但需避免过度依赖AI,仍需人工打磨以确保情感表达与叙事质量。 ☞…

    2026年9月22日
    000
  • linux系统下codeblocks控制台打印中文乱码[通俗易懂]

    linux系统下codeblocks控制台打印中文乱码[通俗易懂]linux系统下codeblocks控制台打印中文乱码[通俗易懂]linux系统下codeblocks控制台打印中文乱码[通俗易懂]linux系统下codeblocks控制台打印中文乱码[通俗易懂]

    大家好,很高兴再次和大家见面,我是你们的朋友全栈君。 在Linux系统下使用CodeBlocks时,如果在控制台中打印中文可能会遇到乱码问题。以下是解决这一问题的详细步骤: 首先,我们来看一下在Linux系统下安装CodeBlocks后,运行以下代码时出现的问题: #include #include…

    2026年9月22日 用户投稿
    600

发表回复

登录后才能评论
关注微信