企业网站建设御彩云销售课程培训视频教程
2026/4/17 22:45:25 网站建设 项目流程
企业网站建设御彩云,销售课程培训视频教程,如手机网站源码,wordpress怎么社交分享以下是 2025–2026 年视角下 MySQL 索引的完整、实用指南#xff08;基于 MySQL 8.0 ~ 8.4 主流版本 InnoDB 引擎#xff09;。 内容结构化、带代码示例、常见误区、优化 checklist 和真实案例#xff0c;目标是让你读完就能真正把查询速度提起来#xff0c;而不是只停留…以下是2025–2026 年视角下 MySQL 索引的完整、实用指南基于 MySQL 8.0 ~ 8.4 主流版本 InnoDB 引擎。内容结构化、带代码示例、常见误区、优化 checklist 和真实案例目标是让你读完就能真正把查询速度提起来而不是只停留在“知道 B 树”层面。一、为什么索引能让查询“飞起来”核心原理B 树 vs B 树项目B 树经典B 树InnoDB 实际使用为什么 B 树更快叶子节点存数据是所有节点都存数据只叶子节点存数据非叶子只存键同一层级能放更多键树更矮叶子节点是否链表否是双向链表范围查询顺序扫描极快范围查询效率中等极高顺序 I/O 而非随机 I/O扇出fan-out较低极高一页 16KB 可存数百~上千键层级少 → 查找次数少InnoDB 页大小—默认 16KB—一句话总结InnoDB 用 B 树 数据页 双向链表 自适应哈希索引adaptive hash index组合让等值 范围 排序 覆盖查询都非常高效。二、MySQL 主流索引类型对比2025–2026 现状索引类型底层结构支持操作典型场景InnoDB 支持MyISAM 支持备注 / 限制MySQL 8.4主键索引B 树, , , BETWEEN, IN, ORDER BY每张表必须有聚簇索引是是必须 NOT NULL UNIQUE唯一索引B 树同上邮箱、手机号、订单号等是是允许 NULL但 NULL 不重复普通索引B 树同上where、order by、group by 高频列是是—复合索引B 树最左前缀匹配多条件组合查询是是遵循最左前缀原则全文索引倒排索引MATCH AGAINST文章搜索、商品标题模糊搜索是ngram / MeCab是InnoDB 5.6 支持空间索引R 树ST_Contains, ST_Within 等GIS、地图附近查询是5.7是必须 GEOMETRY 类型哈希索引哈希表, MEMORY 引擎等值查询不直接支持有自适应哈希否InnoDB 自适应哈希内部使用函数索引8.0B 树对函数/表达式建索引UPPER(name)、JSON_EXTRACT 等是否非常实用降序索引8.0B 树逆序ORDER BY DESC 优化按时间倒序分页是是减少 filesort不可见索引8.0B 树隐藏—测试新索引效果不影响现有查询计划是是安全上线神器三、创建索引的正确姿势推荐写法-- 1. 主键自动创建聚簇索引CREATETABLEusers(idBIGINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,...);-- 2. 普通单列索引CREATEINDEXidx_emailONusers(email);-- 3. 唯一索引CREATEUNIQUEINDEXuk_phoneONusers(phone);-- 4. 复合索引最左前缀原则顺序非常重要CREATEINDEXidx_name_age_cityONusers(name,age,city);-- 5. 覆盖索引查询字段全在索引中无需回表CREATEINDEXidx_coverONorders(user_id,order_time,amount);-- 6. 函数索引MySQL 8.0CREATEINDEXidx_upper_nameONusers((UPPER(name)));-- 7. 降序索引8.0CREATEINDEXidx_time_descONorders(create_timeDESC);-- 8. 全文索引ngram 适合中文CREATEFULLTEXTINDEXft_title_contentONarticles(title,content)WITHPARSER ngram;-- 9. 空间索引CREATETABLElocations(idINTAUTO_INCREMENTPRIMARYKEY,coordPOINTNOTNULLSRID4326,SPATIALINDEXidx_coord(coord));四、复合索引最左前缀原则最容易踩的坑规则复合索引(a,b,c)能用到的查询条件必须从最左边开始连续匹配。查询条件是否走索引 (idx_a_b_c)能用到的索引部分说明WHERE a1是a最左匹配WHERE a1 AND b2是a,b连续最左WHERE a1 AND c3是ab 断开c 无法用WHERE b2否—不符合最左WHERE a1 AND b2是a 范围b 等值a,b范围后等值仍可WHERE a1 ORDER BY b,c是a,b,c排序也能用WHERE a1 ORDER BY c部分a 用索引c filesorta—黄金经验把频率最高、最有区分度的列放最左。五、覆盖索引 回表性能差距可达 5~20 倍回表查了索引但要再去聚簇索引取整行数据 → 额外一次 IO覆盖索引查询的所有字段都在索引中包括 SELECT、WHERE、ORDER BY无需回表经典案例-- 慢回表SELECTid,name,create_timeFROMusersWHEREphone13812345678;-- 快覆盖CREATEINDEXidx_phone_name_timeONusers(phone,name,create_time);SELECTid,name,create_timeFROMusersWHEREphone13812345678;六、2025–2026 高频索引失效场景带解决方案失效场景原因解决方案MySQL 8.0LIKE ‘%xx%’最左通配符用全文索引 / ngram / 业务前缀搜索函数/运算 (WHERE YEAR(create_time)2025)破坏索引列完整性创建函数索引 / 添加计算列 索引类型隐式转换 (WHERE phone 138…)varchar 与 int 比较转字符串统一类型WHERE phone ‘138…’OR 条件两边索引不一致优化器放弃索引拆成 UNION ALL 或都建索引! / NOT IN / IS NOT NULL选择性低或无法范围扫描业务改为正向查询 / IS NULL 用得少索引列上用了 ! / 等部分场景仍可但选择性低时弃用评估区分度联合索引跳跃使用不符合最左前缀调整列顺序或拆索引七、索引优化 checklist生产必查单表索引个数 ≤ 57 个超过容易选错索引 写性能下降每张表必须有主键InnoDB 聚簇索引区分度低的列如 gender、status不要单独建索引频繁更新的列慎建索引写性能下降明显复合索引字段顺序高频 where → 高区分度 → 排序字段 → 覆盖字段优先建覆盖索引用EXPLAINtype、key、rows、Extra判断type: ref / eq_ref / range / index 好ALL / index 坏Extra: Using index覆盖好Using filesort / Using temporary 坏大表加索引用 pt-online-schema-change / gh-ost在线 DDL开启慢查询日志 long_query_time1log_queries_not_using_indexes1定期用ANALYZE TABLE/OPTIMIZE TABLE更新统计信息八、真实案例对比速度提升倍数场景原 SQL / 索引优化后索引 / SQL速度提升用户手机号查信息phone varchar(20), 无索引INDEX(phone)几百几千倍订单按用户时间范围WHERE user_id1 AND create_time BETWEENINDEX(user_id, create_time)1050 倍商品标题模糊搜索LIKE ‘%iPhone%’FULLTEXT(title) MATCH AGAINST几十几百倍按创建时间倒序分页ORDER BY create_time DESC LIMIT 10,10INDEX(create_time DESC)避免 filesortJSON 字段查询JSON_EXTRACT(data,‘$.status’)1生成列 索引 或 函数索引10100 倍如果你当前有慢查询 SQL、EXPLAIN 输出、表结构可以贴出来我帮你现场分析 给出最优索引方案。想深入哪个部分EXPLAIN 字段逐个详解聚簇 vs 非聚簇索引内存布局自适应哈希索引原理全文索引 ngram vs MeCab中文场景大表加索引在线方案gh-ost / pt-osc随时说

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询