sql 中not like ,字段等于null 时会失效

subject not like '%neeee%',subject=null时like 会失效

改为:and ifnull(subject ,'')  not like '%non_focus_pcc_finding%'

### 如何编写SQL语句以避免索引失效 为了确保SQL查询能够高效运行并充分利用已有的索引结构,以下是关于如何避免索引失效的一些最佳实践: #### 1. 遵守最左前缀原则 当使用复合索引时,必须按照索引定义的顺序来匹配字段。如果跳过了某个中间字段,则后续字段无法利用索引。例如,对于一个 `(a, b, c)` 的复合索引,只有 `WHERE a=...` 或者 `WHERE a=... AND b=...` 能够有效利用索引[^1]。 #### 2. 避免在索引列上进行函数操作 任何对索引列的操作都会导致索引失效。比如,`SELECT * FROM table WHERE YEAR(date_column) = 2023;` 这样的查询会使得 MySQL 无法直接使用 `date_column` 上的索引。推荐改写为: ```sql SELECT * FROM table WHERE date_column >= '2023-01-01' AND date_column < '2024-01-01'; ``` #### 3. 使用覆盖索引 覆盖索引是指查询所需的数据完全可以通过索引来获取而无需回表读取数据行的情况。因此,在设计 SQL 查询时,尽量只选择那些被索引覆盖的列,而不是简单地使用 `SELECT *`[^3]。例如: ```sql -- 不好的做法 SELECT * FROM users WHERE status = 'active'; -- 更优的做法 SELECT id, name FROM users USE INDEX (status_index) WHERE status = 'active'; ``` #### 4. 防止隐式的类型转换 当查询条件中的数据类型与数据库中存储的实际数据类型不一致时,可能会触发隐式类型转换,从而破坏索引的有效性。例如,字符串类型的字段不应省略单引号;整数比较也不应该加多余的引号[^1]。下面是一个例子: ```sql -- 错误示例 SELECT * FROM products WHERE price = '99'; -- 如果price是数值型,这里会导致索引失效 -- 正确示例 SELECT * FROM products WHERE price = 99; ``` #### 5. 合理处理LIKE模式匹配 带有通配符 `%` 和 `_` 的模糊查找会影响索引效率。特别是当 `%` 放置于开头位置时(如 `'%abc%'`),几乎总是会造成全表扫描。为了避免这种情况发生,可以考虑全文检索或者调整业务逻辑使 `%` 只出现在右侧[^1]。如下所示: ```sql -- 效率较低的方式 SELECT * FROM articles WHERE title LIKE '%keyword%'; -- 较高效的替代方案 SELECT * FROM articles WHERE title LIKE 'keyword%'; ``` #### 6. 对NULL值和OR运算保持警惕 涉及 NULL 判断以及 OR 条件组合的情况下容易引起复杂度上升甚至放弃走索引路径。一种解决办法就是拆分多个独立子查询再 UNION ALL 结合起来代替单一的大规模过滤表达式。举个实例说明这一点: ```sql -- 存疑形式 SELECT * FROM orders WHERE customer_id IS NULL OR order_status='shipped'; -- 推荐重构版 (SELECT * FROM orders WHERE customer_id IS NULL) UNION ALL (SELECT * FROM orders WHERE order_status='shipped'); ``` #### 7. 强制指定使用的索引 尽管通常情况下让 DBMS 自动决定最优执行计划即可满足需求,但在某些特殊场景下可能需要人为干预指导其行为。这时就可以借助 `FORCE INDEX`, `USE INDEX` 关键字显式声明希望优先尝试哪些候选索引[^2]。示范代码片段如下: ```sql SELECT * FROM employees FORCE INDEX(last_name_idx) WHERE last_name='Smith'; ``` --- ### 总结 遵循以上提到的各项准则可以帮助开发者构建更加精炼有效的 SQL 查询脚本,进而显著改善应用程序的整体响应速度和服务质量。当然除了理论学习之外还需要不断积累实战经验才能真正做到游刃有余。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值