mysql数据库表字段如何选择索引_mysql数据类型优化

雨丽吖_3967

雨丽吖_3967

2026-05-11

711人浏览

原创

该给字段加索引当且仅当它高频出现在where、order by或group by中;区分度低(如is_deleted)或范围查询后列不宜单独建索引;联合索引需按使用顺序设计,并用explain验证命中效果。

mysql数据库表字段如何选择索引_mysql数据类型优化

什么时候该给字段加索引?看查询条件和排序分组

索引不是越多越好,而是为高频、高代价的查询“减负”。如果你的 WHERE 条件里总出现 user_id、status 或 created_at,或者经常用它们做 ORDER BY / GROUP BY,这些就是优先候选。

反例:给 is_deleted(只有 0/1)单独建索引,MySQL 很可能直接忽略它——区分度太低,优化器认为全表扫描更快。

  • 单列索引适合等值查询(=、IN)或范围查询(BETWEEN、>=),但范围之后的列无法走索引
  • 联合索引要注意字段顺序:INDEX (a, b, c) 能加速 WHERE a=1 AND b=2,但对 WHERE b=2 无效
  • 用 EXPLAIN 看 type 是否为 ref 或 range,key 是否命中你建的索引

TEXT/VARCHAR 长度怎么定?别盲目设 255 或 65535

MySQL 的 VARCHAR 实际存储开销 = 内容长度 + 1~2 字节长度头;TEXT 类型则强制走溢出页,访问更慢。选型核心是「够用且留余量」,不是越大越安全。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 用户名、邮箱、手机号:用 VARCHAR(64) 足够(UTF8MB4 下 64 字符最多占 256 字节)
  • 标题类字段:VARCHAR(255) 是常见选择,但若业务明确最长 120 字,就写 VARCHAR(120) —— 更小的字段利于索引缓存和排序性能
  • 避免 TEXT 除非真要存长文本;如果只是偶尔超长,可考虑 VARCHAR(1000) + 应用层截断提醒
  • ENUM 表面省空间,但增删值要 DDL,线上改表风险高,不如用 TINYINT + 注释说明取值含义

时间字段用 DATETIME 还是 TIMESTAMP?看时区和年份需求

两者都存时间,但行为差异很大:TIMESTAMP 自动转时区、范围小(1970–2038)、受 MySQL 时区变量影响;DATETIME 是纯字面值,不转换,范围大(1000–9999),推荐新项目默认用它。

  • 需要自动记录创建/更新时间?用 DATETIME DEFAULT CURRENT_TIMESTAMP(MySQL 5.6+ 支持)
  • 跨时区业务(如全球化后台)必须用 DATETIME,否则 TIMESTAMP 在不同连接时区下读出来的时间会变
  • TIMESTAMP 占 4 字节,DATETIME 占 5 字节(5.6.4+),空间差距微乎其微,别为这省字节牺牲可维护性
  • 如果字段要参与索引且常用于范围查询(比如查最近 7 天订单),DATETIME 更稳定,不受时区设置干扰

NULL 值要不要允许?多数时候设 NOT NULL 更省心

允许 NULL 会让字段多占 1 位空标志位,更重要的是增加查询复杂度:任何涉及该字段的比较(=、!=、IN)都得额外处理 IS NULL 分支,索引也可能失效。

  • 数字类字段:用 0 或 -1 代替 NULL(比如 score 默认 0,比 NULL 更易统计)
  • 字符串字段:空字符串 '' 比 NULL 更直观,也避免 ORM 映射歧义
  • 真有“未知”语义?比如用户未填写生日,可以接受 NULL,但要在应用层显式判断,不能依赖数据库隐式行为
  • NOT NULL 字段在覆盖索引(Covering Index)中更容易被优化器选中,减少回表次数

索引和类型不是一次性拍板的事,上线后得盯着慢查询日志和 SHOW INDEX FROM table_name 的实际使用率。最常被忽略的是联合索引的字段顺序和前缀长度——一个 VARCHAR(500) 字段只用前 20 字符就能区分 99% 的值,那建索引时加个 (content(20)) 就能省下一大半空间和内存。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4423

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

931

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1169

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6361

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3163

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6320

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8621

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1170

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1032

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 189人学习