0

0

SQL 架构设计中的常见误判

舞夢輝影

舞夢輝影

发布时间:2026-01-23 20:29:02

|

914人浏览过

|

来源于php中文网

原创

优先用VARCHAR而非TEXT,慎用外键,区分TIMESTAMP与DATETIME场景,复合索引需覆盖查询路径——类型、约束、时间、索引四类设计须按实际读写特征权衡,否则隐患随流量放大。

sql 架构设计中的常见误判

TEXT 当万能字符串类型用

很多工程师一遇到“字段可能很长”就直接上 TEXT,尤其在 MySQL 中。但 TEXT 类型不支持默认值、不能建普通索引(只能前缀索引)、无法参与内存临时表排序(ORDER BYGROUP BY 时容易触发磁盘临时表),性能隐患明显。

实操建议:

  • 优先用 VARCHAR(255)VARCHAR(1024) —— 大多数业务场景(如标题、摘要、URL)完全够用,且支持索引和默认值
  • 只有真实需要存 >64KB 内容(比如富文本正文、日志快照)才考虑 TEXT,并明确加注释说明用途
  • 若需全文检索,别只靠 TEXT + LIKE,应搭配 FULLTEXT 索引或外部搜索引擎

外键约束被当成“数据一致性保险”

外键看起来很安全,但实际在线上高并发写入场景中,它会成为锁竞争热点。比如订单表 order 关联用户表 useruser_id,每次插入订单都要校验 user 表主键是否存在 —— 这个校验会持读锁,可能阻塞用户信息更新。

更麻烦的是,跨库、分库、读写分离后,外键根本不可用。很多团队后期不得不删掉所有外键,靠应用层兜底。

实操建议:

  • 新项目初期可保留外键,用于开发阶段快速暴露数据逻辑错误(如误删父记录)
  • 上线前评估写入压力:若单表 QPS > 500,或存在批量导入/定时任务高频写入,建议去掉外键,改用应用层校验 + 定期对账脚本
  • NOT NULL + CHECK 约束替代部分业务规则(如状态值限定),比外键轻量且可控

时间字段全用 DATETIME 不区分场景

DATETIMETIMESTAMP 在 MySQL 中行为差异极大:TIMESTAMP 自动转时区、范围小(1970–2038)、占 4 字节DATETIME 无时区转换、范围大(1000–9999)、占 8 字节。但很多人图省事,一律用 DATETIME,结果埋下两个坑:一是日志类时间(如 created_at)本该统一 UTC,却因时区不一致导致排查困难;二是存储空间翻倍,对亿级表的 I/O 和备份影响不小。

天龙企业网站管理系统 2008.net
天龙企业网站管理系统 2008.net

天龙企业网站管理系统,基于.net2.0+access开发,系统架构采用MVC设计模式,是一个十分优秀的.net企业管理系统。其中包括产品发布,新闻发布,企业简价,企业文化,下载中心,客户留言等功能。在V2.0 sp2 基础上再次升级: 1、修正了前台的投票调查功能。 2、增强系统安全性,增加了防SQL注入功能 3、修补了后台漏洞 4、增加了前台游客留言的字符过滤,自动过滤html格式以增强系统安

下载

实操建议:

  • created_at / updated_atTIMESTAMP(配合 DEFAULT CURRENT_TIMESTAMP),确保写入即固化为 UTC
  • 业务意义明确带本地时区的时间(如“用户预约的明天下午三点”)才用 DATETIME,并额外存 timezone_offset 字段
  • 避免在 WHERE 条件里对时间字段做函数操作,例如 WHERE DATE(created_at) = '2024-01-01' 会导致索引失效

索引设计只盯着 WHERE 条件

索引不是光让 WHERE 快就行。如果 SELECT 列太多、ORDER BY 字段没覆盖、或者 JOIN 条件没走索引,照样慢。典型例子:查询“最近 10 条订单”,写成 SELECT * FROM order WHERE user_id = ? ORDER BY created_at DESC LIMIT 10,但只给 user_id 建了单列索引 —— 数据库得先扫出所有该用户的订单,再内存排序,效率极低。

实操建议:

  • 复合索引要按「等值查询字段 → 排序字段 → 覆盖查询字段」顺序组织,例如 (user_id, created_at) 可支撑上面那个查询
  • EXPLAINkey_lenExtra(尤其是 Using filesortUsing temporary)来验证索引是否生效
  • 避免过度索引:每多一个索引,写入就多一次 B+ 树维护,对高频更新表,索引总数建议控制在 5 个以内

架构设计里最危险的不是不知道怎么做,而是用“看起来合理”的方案跳过权衡——比如选类型时没想清楚读写比例,建索引时没模拟真实查询路径。这些细节不会报错,但会在流量上来时悄悄拖垮系统。

相关专题

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

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

685

2023.10.12

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

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

323

2023.10.27

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

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

348

2024.02.23

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

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

1117

2024.03.06

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

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

359

2024.03.06

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

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

717

2024.04.07

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

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

577

2024.04.29

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

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

419

2024.04.29

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

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

精品课程

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

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 805人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号