首页
关于叶子
Search
1
Laravel“高并发”导致数据“统计”异常一例
8,648 阅读
2
Win10突然出现不能连接共享打印机一例
7,173 阅读
3
Laravel 9高并发API数据操作的最佳实践
6,347 阅读
4
[iOS|Xcode]iOS-App自定义启动页制作(uniapp适用)
3,165 阅读
5
[经验存档] 微星(MSI)B150M-Pro-VD Plus安装系统蓝屏一例
2,775 阅读
代码
分享
琐事
MySQL
数码
前端
MacOS
软件
Windows
登录
Search
标签搜索
Laravel
Windows
Laravel-Admin
PHP
uniapp
Vue
前端
chartjs
微信
小程序
App
工具
MySQL
PC
Adobe
AI
HTML
CSS
introduction
selectors
Yesr00
累计撰写
53
篇文章
累计收到
7
条评论
首页
栏目
代码
分享
琐事
MySQL
数码
前端
MacOS
软件
Windows
页面
关于叶子
搜索到
1
篇与
的结果
2024-11-05
【个人总结】MySQL 通用书写和开发规范
叶子工作中经常碰到一些二开的项目,然后呢,项目代码质量和一些规范就比较参差不齐。所以总结了大概如下一些MySQL规范和可优化的内容。1. 命名规范1.1 表命名 使用小写字母:表名应全部使用小写字母。 使用复数形式:表名通常使用复数形式。 避免使用保留字:不要使用 SQL 保留字作为表名。 示例:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100) UNIQUE ); 1.2 字段命名 使用小写字母:字段名应全部使用小写字母。 使用下划线分隔:多单词字段名使用下划线分隔。 避免使用保留字:不要使用 SQL 保留字作为字段名。 示例:CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_date DATETIME, total_amount DECIMAL(10, 2), FOREIGN KEY (user_id) REFERENCES users(id) ); 1.3 索引命名 使用前缀:索引名应以表名或字段名为前缀。 简洁明了:索引名应简洁明了,易于理解。 示例:CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_orders_user_id ON orders(user_id); 2. SQL 语句格式2.1 使用大写关键字 大写关键字:SQL 关键字应使用大写,以提高可读性。 示例:SELECT ID, FIRST_NAME, LAST_NAME, EMAIL FROM USERS WHERE EMAIL = 'user@example.com'; 2.2 适当换行 换行:长 SQL 语句应适当换行,每行不超过 80 个字符。 缩进:使用缩进提高可读性,通常使用 2 个或 4 个空格。 示例:SELECT U.ID, U.FIRST_NAME, U.LAST_NAME, O.ORDER_ID, O.ORDER_DATE, O.TOTAL_AMOUNT FROM USERS U JOIN ORDERS O ON U.ID = O.USER_ID WHERE U.EMAIL = 'user@example.com' ORDER BY O.ORDER_DATE DESC; 2.3 使用注释 行内注释:在复杂的 SQL 语句中使用行内注释,解释关键逻辑。 块注释:使用块注释解释整个 SQL 语句的用途和逻辑。 示例:-- 查询用户及其订单信息 SELECT U.ID, U.FIRST_NAME, U.LAST_NAME, O.ORDER_ID, O.ORDER_DATE, O.TOTAL_AMOUNT FROM USERS U JOIN ORDERS O ON U.ID = O.USER_ID WHERE U.EMAIL = 'user@example.com' -- 过滤指定邮箱的用户 ORDER BY O.ORDER_DATE DESC; -- 按订单日期降序排列 3. 数据类型选择3.1 选择合适的数据类型 整数类型:根据数据范围选择合适的整数类型。 浮点类型:使用 DECIMAL 类型存储精确的小数,避免使用 FLOAT 和 DOUBLE。 日期时间类型:使用 DATE、TIME、DATETIME 或 TIMESTAMP 类型存储日期和时间。 字符串类型:根据字符串长度选择合适的类型。 示例:CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR(100), price DECIMAL(10, 2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); 3.2 避免过度设计 最小化数据类型:选择最小化满足需求的数据类型,以节省存储空间和提高性能。 示例:CREATE TABLE status_codes ( code TINYINT PRIMARY KEY, description VARCHAR(50) ); 4. 索引优化4.1 创建合适的索引 主键索引:每个表应有一个主键索引。 唯一索引:对于需要保证唯一性的字段,创建唯一索引。 组合索引:对于经常一起查询的字段,创建组合索引。 示例:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE, email VARCHAR(100) UNIQUE, first_name VARCHAR(50), last_name VARCHAR(50) ); CREATE INDEX idx_users_first_last_name ON users(first_name, last_name); 4.2 避免过度索引 适度索引:过多的索引会降低写入性能,增加存储开销,应适度创建索引。 示例:-- 不要为每个字段都创建索引 CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_date DATETIME, total_amount DECIMAL(10, 2), FOREIGN KEY (user_id) REFERENCES users(id) ); -- 只为常用查询字段创建索引 CREATE INDEX idx_orders_user_id ON orders(user_id); 5. 查询优化5.1 使用 EXPLAIN 分析查询 使用 EXPLAIN:使用 EXPLAIN 关键字分析查询计划,优化查询性能。 示例:EXPLAIN SELECT U.ID, U.FIRST_NAME, U.LAST_NAME, O.ORDER_ID, O.ORDER_DATE, O.TOTAL_AMOUNT FROM USERS U JOIN ORDERS O ON U.ID = O.USER_ID WHERE U.EMAIL = 'user@example.com' ORDER BY O.ORDER_DATE DESC; 5.2 避免全表扫描 使用索引:尽量使用索引进行查询,避免全表扫描。 选择性高的字段:在 WHERE 子句中使用选择性高的字段。 示例:-- 使用索引字段进行查询 SELECT U.ID, U.FIRST_NAME, U.LAST_NAME, O.ORDER_ID, O.ORDER_DATE, O.TOTAL_AMOUNT FROM USERS U JOIN ORDERS O ON U.ID = O.USER_ID WHERE U.EMAIL = 'user@example.com' ORDER BY O.ORDER_DATE DESC; 5.3 限制返回的记录数 使用 LIMIT:在查询中使用 LIMIT 关键字限制返回的记录数,提高查询性能。 示例:SELECT U.ID, U.FIRST_NAME, U.LAST_NAME, O.ORDER_ID, O.ORDER_DATE, O.TOTAL_AMOUNT FROM USERS U JOIN ORDERS O ON U.ID = O.USER_ID WHERE U.EMAIL = 'user@example.com' ORDER BY O.ORDER_DATE DESC LIMIT 10; 6. 事务管理6.1 使用事务 BEGIN:开始事务。 COMMIT:提交事务。 ROLLBACK:回滚事务。 示例:START TRANSACTION; INSERT INTO users (first_name, last_name, email) VALUES ('John', 'Doe', 'john.doe@example.com'); INSERT INTO orders (user_id, order_date, total_amount) VALUES (LAST_INSERT_ID(), NOW(), 100.00); COMMIT; 6.2 保持事务简短 简短事务:保持事务简短,避免长时间占用资源。 示例:START TRANSACTION; UPDATE users SET email = 'john.new@example.com' WHERE id = 1; COMMIT; 7. 安全性7.1 使用参数化查询 防止 SQL 注入:使用参数化查询防止 SQL 注入攻击。 示例:<?php $pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password'); $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => 'user@example.com']); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($users); ?> 7.2 限制权限 最小权限原则:为数据库用户分配最小必要的权限,避免过度授权。 示例:CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON mydb.* TO 'readonly_user'@'localhost'; FLUSH PRIVILEGES; 8. 备份和恢复8.1 定期备份 定期备份:定期备份数据库,确保数据安全。 示例:mysqldump -u user -p mydb > mydb_backup.sql 8.2 测试恢复过程 测试恢复:定期测试备份数据的恢复过程,确保备份有效。 示例:mysql -u user -p mydb < mydb_backup.sql 9. 文档和注释9.1 编写文档 文档:编写数据库设计文档,记录表结构、字段含义和索引等信息。 示例:# 数据库设计文档 ## 表结构 ### users - **id** (INT, AUTO_INCREMENT, PRIMARY KEY) - **first_name** (VARCHAR(50)) - **last_name** (VARCHAR(50)) - **email** (VARCHAR(100), UNIQUE) ### orders - **order_id** (INT, AUTO_INCREMENT, PRIMARY KEY) - **user_id** (INT, FOREIGN KEY REFERENCES users(id)) - **order_date** (DATETIME) - **total_amount** (DECIMAL(10, 2)) ## 索引 - **idx_users_email** (users.email) - **idx_orders_user_id** (orders.user_id) 9.2 注释代码 注释:在 SQL 代码中添加注释,解释复杂的查询和逻辑。 示例:-- 查询用户及其订单信息 SELECT U.ID, U.FIRST_NAME, U.LAST_NAME, O.ORDER_ID, O.ORDER_DATE, O.TOTAL_AMOUNT FROM USERS U JOIN ORDERS O ON U.ID = O.USER_ID WHERE U.EMAIL = 'user@example.com' -- 过滤指定邮箱的用户 ORDER BY O.ORDER_DATE DESC; -- 按订单日期降序排列 10. 性能监控10.1 监控性能 性能监控:使用性能监控工具(如 SHOW GLOBAL STATUS、SHOW ENGINE INNODB STATUS)监控数据库性能。 示例:SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW ENGINE INNODB STATUS; 10.2 调优参数 调优参数:根据监控结果调优数据库参数,提高性能。 示例:[mysqld] innodb_buffer_pool_size = 1G innodb_log_file_size = 256M max_connections = 100 总结遵循这些详细的 MySQL 书写和开发规范,可以提高代码的可读性、可维护性和可靠性。希望这些规范和示例对你在 MySQL 开发中有所帮助,祝你在数据库开发中取得成功!如果有更多具体需求或问题,欢迎讨论。
2024年11月05日
44 阅读
0 评论
0 点赞