域名空间都有了怎么做网站制作网页焦点图
2026/2/7 12:48:50 网站建设 项目流程
域名空间都有了怎么做网站,制作网页焦点图,做挂网站吗,做购物商城类网站需要视频看了几百小时还迷糊#xff1f;关注我#xff0c;几分钟让你秒懂#xff01;很多开发者会用索引#xff0c;但一问“为什么索引快#xff1f;”就支支吾吾。今天我们就抛开黑盒#xff0c;用 Java Spring Boot 的视角#xff0c;结合生活化类比和底层原理#xff…视频看了几百小时还迷糊关注我几分钟让你秒懂很多开发者会用索引但一问“为什么索引快”就支支吾吾。今天我们就抛开黑盒用Java Spring Boot的视角结合生活化类比和底层原理彻底搞懂这个问题。一、没有索引时全表扫描 翻整本字典假设你有一张用户表user_info100 万条数据CREATE TABLE user_info ( id BIGINT PRIMARY KEY, phone VARCHAR(20), name VARCHAR(50) );现在你要查手机号为138****1234的用户SELECT * FROM user_info WHERE phone 138****1234;❌ 没有索引的情况数据库只能一行一行地从磁盘读取数据直到找到匹配项 —— 这叫全表扫描Full Table Scan。最坏情况查到最后一条才找到 → 扫描 100 万行平均情况也要扫 50 万行每次磁盘 I/O 都很慢机械硬盘约 10ms/次 100 万次 I/O那不得卡死二、有了索引后像查字典目录一样快我们给phone加个普通索引ALTER TABLE user_info ADD INDEX idx_phone (phone);这时 MySQLInnoDB 引擎会为phone列构建一棵B 树。✅ B 树长什么样简化版想象一棵三层的树[130... | 150... | 180...] / | \ [1300000...1309999] [1500000...1509999] [1800000...1809999] | | | 实际数据指针 实际数据指针 实际数据指针非叶子节点只存索引值如手机号区间用于快速导航叶子节点存完整的索引值 主键或行指针并且双向链表连接 查询过程以138****1234为例从根节点开始138...属于130... ~ 150...区间 → 走中间分支到第二层定位到1380000 ~ 1389999的页在叶子节点中二分查找快速定位到138****1234通过主键或聚簇索引回表拿到完整行数据如果是覆盖索引则不用回表✅ 整个过程只需3 次磁盘 I/O树高为 3而不是 50 万次 关键点B 树高度低、扇出大一个节点可存上千个指针所以查询效率极高三、用 Java 模拟 B 树查找 vs 线性查找虽然真实 B 树复杂但我们用简化代码感受差距import java.util.*; public class IndexSimulation { // 模拟 100 万用户数据无序 static ListUser users new ArrayList(); // 模拟 phone - id 的 B 树索引用 TreeMap 近似 static TreeMapString, Long phoneIndex new TreeMap(); static { // 初始化数据 for (long i 1; i 1_000_000L; i) { String phone 138 String.format(%07d, i); users.add(new User(i, phone, User i)); phoneIndex.put(phone, i); // 构建索引 } } // 无索引线性查找 public static User findByPhoneWithoutIndex(String targetPhone) { for (User user : users) { if (user.getPhone().equals(targetPhone)) { return user; } } return null; } // 有索引TreeMap红黑树近似 B 树的有序查找 public static User findByPhoneWithIndex(String targetPhone) { Long id phoneIndex.get(targetPhone); if (id ! null) { // 实际数据库会通过主键回表这里简化 return users.get((int)(id - 1)); } return null; } public static void main(String[] args) { String target 138500000; long start1 System.currentTimeMillis(); User u1 findByPhoneWithoutIndex(target); long time1 System.currentTimeMillis() - start1; long start2 System.currentTimeMillis(); User u2 findByPhoneWithIndex(target); long time2 System.currentTimeMillis() - start2; System.out.println(无索引耗时: time1 ms); System.out.println(有索引耗时: time2 ms); // 输出示例 // 无索引耗时: 15 ms // 有索引耗时: 0 ms } static class User { private Long id; private String phone; private String name; // 构造方法、getter 省略 public User(Long id, String phone, String name) { this.id id; this.phone phone; this.name name; } public String getPhone() { return phone; } } } 虽然TreeMap是红黑树不是 B 树但它体现了有序结构 快速查找的核心思想。在真实数据库中B 树更适合磁盘存储节点大小 16KB一次 I/O 读一页而红黑树适合内存。四、Spring Boot 中如何验证索引生效1. 开启 SQL 日志application.ymllogging: level: com.yourpackage.mapper: debug2. 使用EXPLAIN分析// 在 Mapper 中加一个 explain 方法仅开发环境用 Select(EXPLAIN SELECT * FROM user_info WHERE phone #{phone}) ListMapString, Object explainFindByPhone(Param(phone) String phone);调用后你会看到字段说明typeref表示使用了索引keyidx_phone表示命中了哪个索引rows扫描行数理想是 1如果typeALL说明没走索引五、常见误区以为加了索引就一定快❌ 反例 1对索引列使用函数-- 索引失效 SELECT * FROM user_info WHERE UPPER(phone) 138****1234;❌ 反例 2模糊查询左通配-- 索引失效 SELECT * FROM user_info WHERE phone LIKE %1234;✅ 正确写法-- 右通配可以走索引 SELECT * FROM user_info WHERE phone LIKE 138%;❌ 反例 3联合索引不遵循最左前缀-- 有索引 (name, phone)但只查 phone → 不走索引 SELECT * FROM user_info WHERE phone 138****1234;六、为什么 B 树比哈希、二叉树更适合数据库数据结构是否适合数据库索引原因哈希表❌只支持等值查询不支持范围如WHERE create_time ?二叉搜索树❌树太高100 万数据 → 高度约 20I/O 太多B 树⚠️非叶子节点存数据导致一页存的指针少树更高B 树✅所有数据在叶子节点 叶子链表 非叶子只存索引 → 树更矮、范围查询快InnoDB 选择 B 树就是因为它兼顾等值、范围、排序查询且磁盘友好。七、总结索引快的本质对比项无索引有索引B 树查找方式线性扫描树形分治时间复杂度O(N)O(log N)磁盘 I/O 次数几十万次通常 2~4 次范围查询慢快叶子节点链表内存占用无额外需要存储索引结构一句话总结索引通过预排序 树形结构把“大海捞针”变成“按图索骥”从而实现毫秒级查询。视频看了几百小时还迷糊关注我几分钟让你秒懂

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

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

立即咨询