在软件开发过程中,良好的数据库设计不仅可以提高查询速度和执行SQL的性能,还能增强MySQL的整体性能和可维护性。本文基于公司某位同事整理并授权的数据库规范,结合实际经验,为你提供一份详细的MySQL查询与建表规范指南,并通过正向和反向对比示例加深理解,本文适用于数据库入门和中级用户。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL
) ENGINE=InnoDB;
使用InnoDB
存储引擎支持事务和行级锁定,确保数据一致性和并发性能。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL
) ENGINE=MyISAM;
使用MyISAM
存储引擎不支持事务和行级锁定,在高并发场景下可能导致数据一致性问题。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL
) DEFAULT CHARSET=utf8mb4;
使用UTF8mb4
支持广泛的字符集,包括emoji等特殊字符。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL
) DEFAULT CHARSET=latin1;
使用latin1
字符集无法正确存储和显示非拉丁字符,可能导致乱码问题。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(255) NOT NULL COMMENT '用户名'
);
每个表都有一个明确的主键,便于唯一标识每一行记录。
CREATE TABLE users (
username VARCHAR(255) NOT NULL COMMENT '用户名'
);
没有主键,导致查询效率低下且难以保证数据一致性。
存储图片或视频的路径而不是直接存储二进制数据:
CREATE TABLE user_media (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
media_url VARCHAR(255) NOT NULL
);
直接在数据库中存储大文件(如图片):
CREATE TABLE user_media (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
media BLOB NOT NULL
);
导致数据库体积膨胀,影响性能。
CREATE TABLE d_user_info (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(255) NOT NULL COMMENT '用户名'
) COMMENT='张三-2025.03.17 用户基本信息表';
表名以业务英文名开头,不超过32个字符,并添加详细备注。
CREATE TABLE userinfo (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL
);
表名过于简单,没有业务说明,难以维护。
CREATE INDEX idx_username ON users (username);
CREATE UNIQUE INDEX uniq_email ON users (email);
索引命名清晰,易于理解和维护。
CREATE INDEX index1 ON users (username);
CREATE INDEX index2 ON users (email);
索引命名不规范,难以区分其用途。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(255) NOT NULL DEFAULT '' COMMENT '用户名'
);
字段设置为not null
时必须有默认值,避免使用text
类型。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username TEXT COMMENT '用户名'
);
使用TEXT
类型,可能导致查询效率低下。
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',
price DECIMAL(10, 2) NOT NULL COMMENT '价格'
);
使用DECIMAL
存储浮点数,确保精度。
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',
price FLOAT NOT NULL COMMENT '价格'
);
使用FLOAT
存储浮点数,可能导致精度丢失。
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
user_id INT NOT NULL COMMENT '用户ID'
);
使用自增ID作为主键,避免使用UUID等离散值。
CREATE TABLE orders (
order_id VARCHAR(36) PRIMARY KEY COMMENT '订单ID',
user_id INT NOT NULL COMMENT '用户ID'
);
使用UUID作为主键,可能导致索引性能下降。
CREATE INDEX idx_name_deleted ON users (name, is_deleted);
根据业务需求创建复合索引,优化查询效率。
CREATE INDEX idx_name ON users (name);
CREATE INDEX idx_deleted ON users (is_deleted);
单独为每个字段创建索引,可能导致冗余和低效。
select *
SELECT id, username FROM users WHERE id = 1;
明确指定需要查询的字段,减少不必要的数据传输。
SELECT * FROM users WHERE id = 1;
使用select *
可能导致查询效率低下和不必要的网络传输。
SELECT u.id, u.username
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';
使用外连接代替标量子查询,提高查询效率。
SELECT u.id, u.username
FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE u.id = o.user_id AND o.status = 'completed');
使用标量子查询可能导致性能瓶颈。
SELECT b.id, b.text
FROM (SELECT id FROM test a LIMIT 10000, 10)
LEFT JOIN test b ON a.id = b.id;
分页查询优化,避免全表扫描。
SELECT id, text FROM test LIMIT 10000, 10;
直接使用LIMIT
可能导致性能问题,尤其是在大数据量的情况下。
通过上述内容的介绍,给大家分享了MySQL数据库设计与管理的最佳实践。从基本规范、命名规范、数据表设计规范、索引规范到SQL开发规范,每一个环节都至关重要。遵循这些规范不仅能提升查询速度和执行SQL的性能,还能增强系统的整体稳定性和可维护性。
你认为在数据库设计和管理中,还有哪些最佳实践是没有提到但非常重要的?欢迎大家在评论区留言,一起参与讨论。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。