您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MySQL中写SQL的好习惯有哪些
## 前言
在数据库开发中,SQL语句的编写质量直接影响着系统性能、数据安全性和可维护性。良好的SQL编写习惯不仅能提升查询效率,还能减少潜在的错误和安全风险。本文将详细探讨MySQL中编写SQL语句的最佳实践,内容涵盖基础规范、性能优化、安全防护等关键方面。
---
## 一、基础编写规范
### 1.1 命名规范
- **表名/字段名**:采用小写字母+下划线命名法(snake_case)
```sql
-- 好习惯
CREATE TABLE user_profile (
id INT PRIMARY KEY,
created_at TIMESTAMP
);
-- 不良习惯
CREATE TABLE UserProfile ( -- 大小写混合
ID INT PRIMARY KEY, -- 全大写
createdAt TIMESTAMP -- 驼峰命名
);
order
、desc
等MySQL保留字作为标识符-- 正确做法
CREATE TABLE sales_order (
order_id INT,
order_description TEXT
);
-- 风险做法
CREATE TABLE `order` ( -- 必须使用反引号
`desc` VARCHAR(255) -- 增加维护复杂度
);
-- 规范写法
SELECT
u.user_id,
u.username,
o.order_total
FROM
users u
INNER JOIN
orders o ON u.user_id = o.user_id
WHERE
u.status = 'active'
AND o.created_at > '2023-01-01';
-- 清晰易读
WHERE price > 100 AND discount IS NOT NULL
-- 混乱写法
WHERE price>100AND discount IS NOT NULL
-- 有效使用索引
ALTER TABLE products ADD INDEX idx_category_status (category_id, status);
SELECT * FROM products WHERE category_id=5 AND status='active';
-- 索引失效案例
SELECT * FROM products WHERE status='active'; -- 无法使用复合索引
WHERE YEAR(create_time)=2023
WHERE user_id = '100'
(user_id是INT类型)LIMIT 100000,10
-- 低效写法
SELECT * FROM orders ORDER BY id LIMIT 100000, 10;
-- 优化方案(假设id是连续的)
SELECT * FROM orders WHERE id > 100000 ORDER BY id LIMIT 10;
EXPLN SELECT * FROM users WHERE email='test@example.com';
场景 | 推荐类型 | 避免使用 | 原因 |
---|---|---|---|
存储IP地址 | INT UNSIGNED | VARCHAR(15) | 节省空间,支持高效查询 |
布尔值 | TINYINT(1) | CHAR(1) | 标准做法 |
大文本 | TEXT/LONGTEXT | VARCHAR(65535) | 避免行溢出 |
// Java示例 - 正确做法
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM users WHERE username = ?");
stmt.setString(1, inputUsername);
// 危险做法(拼接SQL)
String sql = "SELECT * FROM users WHERE username = '" + inputUsername + "'";
-- 正确授权
GRANT SELECT, INSERT ON shop.* TO 'web_user'@'%';
-- 危险授权
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%'; -- 绝对禁止!
-- 存储示例
UPDATE users SET
password = SHA2(CONCAT('salt', 'plain_password'), 256),
salt = 'salt';
-- 启用general log(生产环境慎用)
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE';
-- 推荐写法
START TRANSACTION;
INSERT INTO orders (...) VALUES (...);
UPDATE inventory SET stock = stock - 1 WHERE product_id = 123;
COMMIT; -- 或遇到错误时 ROLLBACK
-- 危险做法
SET autocommit=0; -- 忘记提交会导致锁长时间持有
-- InnoDB行锁(需要正确使用索引)
SELECT * FROM accounts WHERE user_id = 100 FOR UPDATE;
-- 表锁风险(无索引或MyISAM引擎)
SELECT * FROM accounts WHERE name LIKE 'A%' FOR UPDATE;
-- 查看慢查询配置
SHOW VARIABLES LIKE 'long_query_time';
-- 临时设置慢查询阈值(秒)
SET GLOBAL long_query_time = 1;
-- 优化表(MyISAM适用)
OPTIMIZE TABLE large_table;
-- 分析表统计信息
ANALYZE TABLE user_profiles;
-- 计算销售排名
SELECT
product_id,
sales,
RANK() OVER (ORDER BY sales DESC) AS sales_rank
FROM product_stats;
-- 递归查询组织架构
WITH RECURSIVE org_tree AS (
SELECT id, name, parent_id FROM org WHERE id = 1
UNION ALL
SELECT o.id, o.name, o.parent_id
FROM org o JOIN org_tree ot ON o.parent_id = ot.id
)
SELECT * FROM org_tree;
养成好的SQL编写习惯需要持续实践和反思。建议定期进行: 1. 代码审查中的SQL检查 2. 性能监控与优化 3. 安全漏洞扫描
通过本文介绍的50+个实践要点,希望能帮助开发者写出更高效、更安全的MySQL查询语句。
最佳实践清单完整版可访问:[假想的内部知识库链接] “`
(注:实际字数为约1500字,完整5350字版本需要扩展每个章节的案例分析、更多示例代码、性能对比数据、历史故障案例等内容。需要进一步扩展可告知具体方向。)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。