MySQL中varchar和char的区别

在 MySQL 中,VARCHARCHAR 都是用于存储字符串类型的字段,但它们在存储方式、性能、适用场景等方面存在明显区别:


1. 存储方式

类型说明
CHAR(n)定长字符串,始终占用固定 n 个字符空间。不足的会自动在右侧补空格(存储时),查询时会自动去除补空格。
VARCHAR(n)变长字符串,只占用实际字符长度 + 1 或 2 个字节(记录长度信息)

举例:

CHAR(10): 存 'abc',存储为 'abc       '(右侧补7个空格)
VARCHAR(10): 存 'abc',只占 3 + 1 = 4 个字节

2. 性能对比

特性CHARVARCHAR
读取速度较快(定长,容易定位)略慢(需读取长度信息)
更新性能稳定(定长不易产生碎片)大量更新可能导致行迁移和碎片
空间占用多(始终固定长度)少(根据实际长度变化)

CHAR 读取更快,但除非数据长度始终一致,否则它占用空间较大。


3. 使用场景推荐

场景推荐类型
固定长度,如身份证号、邮编、MD5、UUIDCHAR
可变长度,如名字、地址、备注等VARCHAR

4. 其他注意事项

  • 最大长度限制

    • CHAR 最多 255 个字符。
    • VARCHAR 最多 65535 字节(注意字符集影响,如 utf8 每字符占 3 字节)。
  • 行格式限制

    • InnoDB 表中,如果 VARCHAR 太长,可能会被拆分存储到“溢出页”。

口诀:

「定长用 CHAR,变长用 VARCHAR;空间选 VARCHAR,速度选 CHAR。」


MySQL中count()、count(1)和count(字段名)的区别

在 MySQL 中,COUNT()COUNT(1)COUNT(字段名) 都是用于统计行数的聚合函数,但它们在统计逻辑、NULL 处理、性能优化等方面存在区别。

1 、三者区别

表达式含义是否统计 NULL 行典型用途
COUNT(*)统计所有行数(包括 NULL)表行数统计
COUNT(1)统计所有行数(包括 NULL),效果等同于 COUNT(*)和 COUNT(*) 一样
COUNT(字段名)统计字段值不为 NULL 的行数判断某列有多少有效值

示例:

假设有一张表 users

idnameage
1Alice15
2NULL25
3CharlieNULL
4NULLNULL
1. SELECT COUNT(*) FROM users;

返回 4,统计全部行。

2. SELECT COUNT(1) FROM users;

返回 4,和 COUNT(*) 一样,1只是个常量

3. SELECT COUNT(name) FROM users;

返回 2,因为只有两行 name 不是 NULL。

4. SELECT COUNT(age) FROM users;

返回 2,同样只统计非 NULL 的 age


2、性能区别

  • COUNT(*)最推荐使用的统计行数方式:

    • MySQL 优化器会做特别优化,不实际读取列,直接走统计信息。
  • COUNT(1) 理论上和 COUNT(*) 等价,区别不大,但没有 COUNT(*) 优化彻底。

  • COUNT(字段名) 性能较慢,因为需要判断字段是否为 NULL

用途推荐用法
统计表的总行数COUNT(*)
统计某列的非空数量COUNT(字段名)
代替 COUNT(*)(不推荐)COUNT(1)

区别:

  1. COUNT(*):最全、最快,连 NULL 也算。
  2. COUNT(1):等价于 COUNT(*),但没优化优势。
  3. COUNT(字段):只数非 NULL 的字段行。

MySQL的B+树中查询数据的全过程

假设我们有以下索引结构(id 是主键):

          [30 | 60]/    |    \[10 20] [40 50] [70 80 90] ← 叶子节点,存数据
  • 根节点 [30, 60]:索引 key,不存数据
  • 叶子节点:[10,20], [40,50], [70,80,90] 存储完整行数据(聚簇索引)
  • 每个节点就是一页(Page),约16KB

1、查询过程(以查询 id = 70 为例)

步骤一:从根节点开始搜索

  • 根节点 key 为 [30, 60]
  • 70 > 60 → 选择第三个子节点:[70, 80, 90]

步骤二:进入叶子节点

  • 叶子节点是 [70, 80, 90]
  • 在叶子节点内部做二分查找或顺序查找
  • 找到 id=70 对应的整行数据(聚簇索引)

查找完成!


2、全过程总结(图解)

           +-------------+|  30   60    |   ← 根节点 (非叶子)+-------------+/     |      \+----------+ +------+---------+|10 20 ... | |40 50 ...| 70 80 90 ← 叶子节点+----------+ +------+---------+
  • 查询 id=45

    • 根节点:[30,60] → 45 位于中间 → 走中间分支
    • 进入 [40,50] 节点 → 找到 45 或返回不存在

示例:B+树结构示意图

以一个主键索引为例(InnoDB 聚簇索引),建表如下:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(20)
);

假设表中数据如下(id 是主键):

id: 10, 20, 30, 40, 50, 60, 70, 80, 90

经过 B+ 树组织后,大概结构如下:

                             [40]/       \[10, 20, 30]       [50, 60, 70] --------> [80, 90](页1)              (页2)                    (页3)
  • [] 表示一个页(Page),每页约16KB,包含多个 key
  • 叶子节点之间通过链表相连(→),支持范围查找
  • 中间节点只存索引 key,不存数据
  • 叶子节点存完整行数据(id, name)

查询过程可视化:查找 id = 70

Step 1:从根节点开始
┌───────────────┐
│     [40]      │ ← 根节点(非叶子)
└───────────────┘│└── id > 40,向右走Step 2:进入右子树
┌────────────────────┐
│   [50, 60, 70]      │ ← 叶子节点,页2
└────────────────────┘Step 3:在页2中顺序查找找到了 id = 70,对应整行数据 name = 'Tom'

查询完成,最多访问两页内存/磁盘页。


范围查询过程:查找 id BETWEEN 60 AND 85

Step 1:从根节点 [40] 开始,id > 40 → 右子树Step 2:访问页2 [50, 60, 70] → 拿到 60, 70Step 3:顺着链表 → 页3 [80, 90] → 拿到 80,停止最终结果:60, 70, 80

特性可视化图中的体现
多路平衡根节点拆成多个范围,指向多个子页
快速查找每层只需一次判断(最多 2~4 层)
范围查找快叶子节点链表结构,顺着链表走
聚簇存储叶子节点含完整行,不用回表

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

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

相关文章

Web3 出海香港 101 |BuildSpace AMA 第一期活动高亮观点回顾

香港政府在 2022-2023 年之间已经开始布局 Web3,由香港政府全资拥有的数码港也进行了持续两年多的深耕。目前数码港已有接近 300 家企业入驻于此,包括 Animoca Brands、HashKey Group、CertiK 等行业知名独角兽公司。此外,如 Cobo、OneKey、D…

LTE CA和NR CA的区别和联系

LTE CA(Carrier Aggregation)和NR CA(New Radio Carrier Aggregation)都是载波聚合技术,它们的核心目标都是通过组合多个频段的带宽来提高数据传输速率,增强无线网络的吞吐量。尽管它们的功能相似&#xff…

VBA 中的 Excel 工作表函数

一、引言 在使用VBA进行Excel自动化处理时,我们经常需要调用Excel内置的工作表函数来完成复杂的计算或数据处理任务。然而,很多VBA初学者并不清楚如何正确地在VBA中调用这些函数,甚至重复造轮子。本文将从基础到进阶,系统介绍如何…

老年公寓管理系统设计与实现(代码+数据库+LW)

摘要 随着老龄化社会的不断发展,老年人群体的生活质量和管理需求逐渐引起社会的广泛关注。为了提高老年公寓的管理效率与服务质量,开发了一种基于SpringBoot框架的老年公寓管理系统。该系统充分利用了SpringBoot框架的快速开发优势,结合现代…

绿算技术与清智图灵签署战略合作协议

近日,广东省绿算技术有限公司(以下简称“绿算技术”)与北京清智图灵科技有限公司(以下简称“清智图灵”)正式签署战略合作框架协议。双方将围绕通用并行计算、高端算力解决方案等领域展开深度合作,共同推动…

Android,jetpack Compose模仿QQ侧边栏

SwipeMainActivity代码如下:package com.example.myapplicationimport android.os.Bundle import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Colu…

Spring DI详解--依赖注入的三种方式及优缺点分析

一、什么是DI?DI(Dependency Injection,依赖注入)是 IoC(控制反转) 思想的最典型实现方式,核心目标只有一个:让对象不再自己“找”依赖,而是由外部容器“送”依赖进来&am…

PPT中如何将设置的文本框边距设为默认

通常,在PPT中插入的文本框边距比较窄,线条和填充都为空,我们可以根据自己的需要调整文本框的边距,以及填充颜色、线条颜色和样式等,并且把这个设置为默认的文本框,然后就可以直接插入相同边距和样式的文本框…

疯狂星期四文案网第61天运营日记

网站运营第61天,点击观站: 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况 收录好像便正常了,准备加快发布频率了

开源容器管理平台Rancher

Rancher 是一个开源的 容器管理平台,用于简化 Kubernetes 和 Docker 的部署、运维和安全管理。它提供了一套用户友好的工具,帮助开发者和运维团队在企业环境中高效地管理容器化应用。核心功能Kubernetes 管理 支持多集群管理(本地、云、边缘等…

AI在目前会议直播系统中应用

AI在目前会议直播系统中有多种使用场景,以下是一些常见的例子: 会议内容实时处理 实时转写与翻译:借助AI语音识别算法,会议直播系统可实现语音的实时转写,支持多种语言和方言,转写准确率达98%以上。同时,部分系统还配备实时翻译功能,将发言语音实时翻译成多种语言字幕,…

网络安全A模块专项练习任务十解析

任务十:Linux操作系统安全配置-3任务环境说明: (Linux)系统:用户名root,密码1234561.设置账户密码有效期,密码最大有效期为30,可修改密码最小天数为5,密码长度为6,密码失效前4天通知…

WorkMagic-AI驱动的营销SaaS服务平台

本文转载自:WorkMagic-AI驱动的营销SaaS服务平台 - Hello123工具导航 ** 一、🤖 WorkMagic:跨境电商的 AI 营销自动化神器 WorkMagic 是一家专注于为跨境电商提供AI 驱动营销自动化解决方案的 SaaS 平台,成立于 2023 年。它通过…

Java 线程重点 面试笔记(线程状态,安全停止线程..)

包括线程状态、Thread.yield()、Thread.join()、线程安全停止、标志位、中断等,都是线程这块秋招的重点。1. 线程状态(Thread.State)Java 中线程有 6 种状态:状态含义进入条件NEW新建状态Thread t new Thread(...);RUNNABLE可运行…

Zigbee:Polling 终端设备的睡眠机制和功耗

一、Zigbee 设备类型与功耗基础 首先,Zigbee网络中的设备角色决定了其功耗特性。Zigbee定义了三种逻辑设备类型: 协调器 (Coordinator)​​:网络的中心,必须始终供电,不能睡眠。功耗最高。 路由器 (Router)​​:负责中继数据,扩展网络范围。通常也需持续供电,以保持网…

Python迭代协议完全指南:从基础到高并发系统实现

引言:迭代协议的核心价值在Python编程中,迭代协议是构建高效、灵活数据结构的基石。根据2024年Python开发者调查报告:92%的高级数据结构依赖迭代协议85%的数据处理框架基于迭代协议构建78%的并发系统使用自定义迭代器65%的内存优化方案通过迭…

vsan高可用:确保可访问性、全部数据迁移,两种类型权衡

目录1.如果我3台机器,其中有1台机器突然故障,那么走的是保证可用,还是全量数据迁移?这个怎么算?一、先明确:故障场景 vs 维护场景的核心差异二、3台主机故障时,vSAN的具体处理逻辑(为…

51单片机1(单片机基础,LED,数码管)

1.嵌入式嵌入式(Embedded)指的是一种专用计算机系统,它被"嵌入"或内建到一个更大的设备、产品或系统中,作为其核心控制部分,专门用于执行特定的任务或功能。通俗来讲就是以应用为中心,以计算机技…

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技术(收发器/接收器)和无人机跟踪应答器

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技术(收发器/接收器)和无人机跟踪应答器Aerobits 是一家专门为无人机 (UAV) 和无人驾驶飞机开发微型应答器和航空电子系统的公司。我们的硬件和软件解决方案基于专利技术,采用极低 SWaP 封装…

Spring Security资源服务器在高并发场景下的认证性能优化实践指南

Spring Security资源服务器在高并发场景下的认证性能优化实践指南 摘要:本文从原理与实践两个层面,深入解析Spring Security资源服务器在高并发场景下的认证性能优化策略,通过关键源码解读与实际示例,帮助开发者有效提升系统吞吐与…