复合索引应按等值查询字段(高频优先)、范围查询字段(仅一个)、ORDER BY字段(方向一致)顺序建立;SELECT *会强制回表降低性能;OR条件易使索引失效,宜改写为UNION;分区表中分区键应置于复合索引最左列。复合索引该按什么顺序建?顺序直接决定查询能否命中索引------MySQL/PostgreSQL 的 B-Tree 索引是左前缀匹配的,WHERE a = 1 AND b = 2 AND c > 3 能用上 (a, b, c),但换作 (b, a, c) 就只能用上第一个字段 b(如果没其他条件),a 和 c 就失效了。实操建议:把等值查询字段(=、IN)放最左边,且高频字段优先范围查询字段(>、BETWEEN、LIKE 'abc%')紧接其后,且只能有一个------再往后字段无法被索引利用ORDER BY 字段可追加在末尾,但仅当排序方向一致(全 ASC 或全 DESC)且无混合时才有效避免把 SELECT 中的计算字段(如 UPPER(name))或函数结果作为索引首列,否则无法走索引SELECT * 会拖垮多维查询性能吗?会,尤其在宽表+复合索引场景下。索引本身可能覆盖查询(Covering Index),但 SELECT * 强制回表------即使所有 WHERE 条件都命中索引,仍要根据主键去聚簇索引捞出所有字段,IO 成倍增加。实操建议:只查真正需要的字段,比如 SELECT user_id, status, created_at,而非 SELECT *若常查固定几列,考虑把它们全包含进复合索引末尾(叫"索引覆盖"),例如索引 (tenant_id, status, created_at, user_id) 可让 SELECT user_id, created_at FROM t WHERE tenant_id = ? AND status = ? 完全免回表注意大字段(TEXT、JSON、长 VARCHAR)哪怕没选,只要在表结构里,回表时仍要读取整行,影响依然存在WHERE 中用了 OR,复合索引还有效吗?大概率失效。比如 WHERE a = 1 OR b = 2,即使有 (a, b) 索引,优化器通常放弃走索引,改用全表扫描------因为 OR 拆解后是两个独立范围,B-Tree 不支持高效合并。 ARTi.PiCS ARTi.PiCS是一款由AI驱动的虚拟头像生产器,可以生成200多个不同风格的酷炫虚拟头像
相关推荐
非优秀程序员1 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》用户956256254296 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结SelectDB6 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系威哥爱编程6 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来这个DBA有点耶6 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返威哥爱编程6 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官2601_967980117 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒伞伞悦读7 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验新*7 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化这个DBA有点耶8 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效