数据库索引提升检索效率的核心原理是避免全表扫描,通过高效的数据结构快速定位目标数据。下面从原理、结构、实际效果和注意事项几个层面来解释。
假设有一张 1000 万行 的用户表:
SELECT * FROM user WHERE username = 'zhangsan';
没有索引:数据库必须逐行扫描整个表
→ 平均比较 500 万次
→ 磁盘 IO 多、查询慢
有索引:数据库直接通过索引结构找到目标行
→ 比较次数从百万级降到几十次
→ 查询快
索引并不是魔法,而是:
对某一列(或多列)的值建立的有序结构,并记录对应数据位置
最常见的是 B+Tree 索引(MySQL InnoDB 默认)。
以一棵 3 层的 B+Tree 为例:
✅ 时间复杂度从 O(N) 降到 O(log N)
以 username 索引为例:
| username | 行地址 / 主键 |
|---|---|
| alice | 1023 |
| bob | 2045 |
| zhangsan | 8891 |
查询流程:
zhangsanSELECT * FROM order WHERE order_id = 10001;
SELECT * FROM order WHERE create_time BETWEEN '2024-01-01' AND '2024-01-31';
SELECT * FROM user ORDER BY age;
age 有索引常见原因:
-- 对索引列使用函数
WHERE DATE(create_time) = '2024-01-01'
-- 隐式类型转换
WHERE phone = 13800138000 -- phone 是 varchar
-- 前导模糊查询
WHERE name LIKE '%san'
-- OR 条件中部分无索引
WHERE a = 1 OR b = 2
数据库索引通过 B+Tree 等有序数据结构,把“逐行扫描”变成“快速定位”,从而大幅减少磁盘 IO 和比较次数,提升检索效率。
如果你愿意,我可以:
你更想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。