SQL备注

本文详细介绍了SQL语句的优化技巧,包括合理的查询顺序、避免使用SELECT *、使用COUNT(*)进行统计、减少JOIN操作、适当字段冗余、使用UNION代替OR条件查询等。同时,还讲解了如何优化表设计、配置参数设置,以及如何正确使用索引提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、顺序

SQL语句的顺序不是解析的顺序,实际为

FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT 
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>

二、语句

  1. 尽量不使用SELECT *
  2. 统计使用SELECT COUNT(*)
  3. 尽量不使用内置函数,不对字段进行计算
  4. 减少JOIN,适当字段冗余
  5. 适当使用UNION代替OR条件查询
  6. WHERE条件须使用到索引,符合左前缀
  7. WHERE条件为非索引查找一条数据时应使用LIMIT 1避免找到一条后继续查找
  8. AND除索引外的条件,筛选力度大的优先(优化器会自动优化,但是你应该知道)
  9. LIKE模糊查询注意符合左前缀
  10. IN后数组不宜过大,注意使用EXISTS代替
  11. ORDER BY适当建立联合索引,注意SELECT字段不使用索引问题
  12. 注意OFFSET过大效率低问题
  13. 多使用EXPLAIN才是关键

三、表

  1. 表名必须使用单数小写加下划线形式
  2. 对于布尔型字段命名is_,has_,can_等,unsigned tinyint,0否1是
  3. InnoDB中推荐varchar代替char 引文 (但是固定表效率更高?)
  4. 小数使用decimal存储,doublefloat会精度丢失
  5. text类型应单独建立表分离出来
  6. 主键索引名pk_,唯一索引名uk_,普通索引名idx_
  7. 具有唯一性字段必须建立唯一索引
  8. 字符型索引的建立一般没必要全长度索引
  9. 字段名不该使用desc,range等保留字
  10. 字段尽量not null
  11. 应该写属性comment
  12. 实际应用中不使用外键.
  13. 一张表只能有一个AUTO_IN CREMENT字段且该字段必须为KEY

四、配置

  1. max_connections最大连接数。1
  2. back_log超过最大连接数存放在堆栈中的等待数
  3. wait-timeout连接闲置最大时间值
  4. thread_concurrency应设为CPU核数的2倍,cup数*核数*2
  5. skip-name-resolve禁用DNS解析
  6. key_buffer_size索引块的缓冲区大小
  7. innodb_buffer_pool_size针对InnoDB的参数
  8. sort_buffer_size排序缓冲区大小
  9. set global slow_query_log=1;开启慢查询日志

  1. ↩︎
### MyBatis 中 SQL 语句注释的使用方法 在 MyBatis 的 XML 映射文件中,SQL 语句可以添加注释来增强代码的可读性和维护性。然而,在实际应用过程中需要注意一些细节以避免潜在错误。 #### 常见的注释方式及其注意事项 1. **标准注释不可用** - 在 MyBatis 的 SQL 文件中,传统的 `--` 或者 `/* */` 风格的注释可能会引发解析问题[^3]。这是因为 MyBatis 对这些注释可能无法正确处理,尤其是当注释中包含了 `${}` 或 `#{}` 这样的占位符时,MyBatis 可能会误将其识别为动态参数绑定的一部分[^1]。 2. **推荐使用的注释形式** - 推荐采用 `<!-- -->` 形式的 HTML 注释语法。这种注释不会被 MyBatis 解析器误解为 SQL 片段的一部分,并且能够有效隐藏日志中的冗余信息。 示例代码如下: ```xml <!-- 删除指定 ID 列表中的用户 --> DELETE FROM user WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> ``` 3. **动态 SQL 场景下的注释** - 如果涉及复杂的动态 SQL 构建逻辑,则应特别注意注释的位置和内容。例如,对于 `<if>`、`<choose>` 等标签内的条件判断部分,建议仅对业务逻辑进行描述性的注释,而不要嵌入可能导致冲突的关键字或符号[^4]。 #### 使用 Java 注解替代 XML 定义的情况 除了通过 XML 文件配置外,还可以利用 MyBatis 提供的 Java 注解功能完成简单的 CRUD 操作定义。这种方式下无需担心传统意义上的 SQL 注释问题,因为所有的查询字符串都直接硬编码于程序源码之中[^2]。 示例代码展示如何借助 `@Delete` 实现批量删除操作: ```java @Delete({ "<script>", "DELETE FROM user", "WHERE id IN ", "<foreach collection='array' item='item' open='(' separator=',' close=')'>", "#{item}", "</foreach>", "</script>" }) void deleteUsersByIds(int[] ids); ``` 上述例子展示了即使是在基于注解的形式下也可以灵活运用脚本片段包裹多行命令并保持良好的结构化表达能力的同时规避掉常规文本型数据库指令里的特殊字符干扰风险。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值