mysql中and优先级高于or,混用时必须加括号明确逻辑分组,如(status='active' or type='vip') and score>80;同字段多值or应改用in避免索引失效;复合索引需遵循最左前缀原则,等值条件在前、范围条件在后。

能用 WHERE 加逻辑运算符直接写,但别盲目堆 AND 或 OR —— 多数性能问题和结果偏差,其实出在条件组合方式和索引没对上。
WHERE 中 AND 和 OR 的行为差异
两者语义不同,执行路径也不同:AND 要求所有条件同时成立,MySQL 通常能走索引下推(ICP);OR 是“任一满足”,容易触发全表扫描,尤其当各条件字段没共用索引时。
- 写
WHERE a = 1 AND b > 100:如果存在复合索引(a, b),能用上全部两列 - 写
WHERE a = 1 OR b = 2:即使a和b各有单列索引,MySQL 可能启用index_merge,但这是兜底策略,效率不稳定 - 混合使用时必须加括号,比如
WHERE (a = 1 OR a = 2) AND c > '2024-01-01',否则AND优先级高于OR,逻辑会错
IN 替代多个 OR 更安全
当要匹配离散值(如状态码、类型枚举),IN 不仅写法简洁,还更利于优化器选择索引,且不会因字段 NULL 值导致意外结果(而 OR 在涉及 IS NULL 时易漏行)。
- 推荐:
WHERE status IN ('active', 'pending') - 不推荐:
WHERE status = 'active' OR status = 'pending'(等价但可读性差,且无法利用IN的内部优化) - 注意:
IN子句里不要放太多值(一般不超过几百),否则可能触发临时表或内存溢出;超量建议改用临时表 + JOIN
复合索引怎么建才真有用
不是“把 WHERE 里出现的字段全塞进一个索引”就行。关键看查询模式是否满足「最左前缀原则」,以及等值与范围条件的顺序。
- 等值条件(
=、IN)放左边,范围条件(>、BETWEEN)放右边,例如查询WHERE shop_id = 123 AND category = 'book' AND price > 50,索引应为(shop_id, category, price) - 如果写成
(price, shop_id, category),price > 50之后的字段就失效了 - 用
EXPLAIN看key是否命中你建的索引、rows是否明显下降,比猜更可靠
模糊查询 LIKE 怎么避免拖慢整条 SQL
LIKE 本身不坏,坏的是写法。前导通配符(如 '%abc')必然无法走索引,后缀型('abc%')则可以。
- 能用
LIKE 'prefix%'就别用LIKE '%prefix' - 需要全文检索场景(比如搜索商品描述),别硬扛
LIKE,直接上FULLTEXT索引 +MATCH ... AGAINST - 区分大小写问题:默认
LIKE依赖字段 collation,若需大小写敏感,显式加BINARY,如WHERE BINARY name LIKE 'John%'
真正卡住多条件查询的,往往不是语法写错,而是 WHERE 条件和索引设计之间没对齐——先看 EXPLAIN,再调索引,最后才动 SQL 逻辑。否则改来改去,还是在原地打转。











