RSS
菜单
社区成员个人主页
阿成员
DEV CN / 成员主页

阿青 · 社区话题账号

查看阿青 · 社区话题账号发布的技术文章、关注圈子与公开讨论。

0技术文章4关注圈子467圈内发布1关注者
COMMUNITY POSTS

交流圈发布内容

作者在不同技术圈子中的观点与讨论

1
# MySQL

MySQL 前缀索引是什么?cardinality 怎么理解?

前缀索引:对长字符串列只取前 N 字符建索引(KEY idx(name(10))),节省索引空间、加快写入;代价:区分度可能下降(不同值前缀相同)、ORDER BY 无法用索引排序、覆盖索引失效。cardinality:索引列去重值的数量(基数),基数越高区分度越好;查询优化器用它估算选择性与是否走索引;ANALYZE TABLE 更新统计信息。设计:前缀长度取使区分度接近全列的长度(SELECT COUNT(DISTINCT LEFT…

2
# MySQL

MySQL 为什么索引能加速查询但会拖慢写入?

查询:索引把全表扫描(O(n) 随机 IO)变成 B+ 树查找(O(log n),树高 3-4 次 IO),且有序结构加速排序/范围。写入(INSERT/UPDATE/DELETE):① 每建一个索引,写操作都要额外维护对应 B+ 树(插入/删除节点、可能页分裂);② 索引越多维护成本越高;③ 更新索引列还需调整树结构。平衡:读多写少多建索引;写密集控制索引数量(单表建议 < 5-6 个);索引列避免频繁更新;用覆盖/联合索引减少冗余单…

3
# MySQL

MySQL 索引下推(ICP)是什么?

索引下推(Index Condition Pushdown):MySQL 5.6+ 优化——二级索引扫描时,把 WHERE 中能由索引列判断的条件(下推)在引擎层过滤,减少回表次数。示例:联合索引 (name, age),WHERE name LIKE '张%' AND age > 20——无 ICP 先按 name 取所有主键回表再过滤 age;有 ICP 在索引遍历时直接用 age 过滤,只回表符合条件的行。EXPLAIN Extr…

4
# MySQL

MySQL 回表是什么?怎么避免?

回表 = 通过二级索引找到主键后,再到聚簇索引(主键 B+ 树)取整行数据的过程(两次 B+ 树查找)。触发:查询列包含二级索引中没有的列。避免方式:① 覆盖索引(查询列都进索引);② 用主键直接查询(走聚簇索引无需回表);③ 联合索引设计覆盖高频查询。代价:回表是随机 IO(主键值不连续),性能开销明显。优化器会在回表成本高时放弃二级索引(选择全表扫描或主键索引),EXPLAIN 的 Extra 列显示 Using index(覆盖)…

5
# MySQL

MySQL 唯一索引、普通索引、全文索引、空间索引的区别?

唯一索引:值唯一(允许多个 NULL),保证数据唯一性(业务约束),插入重复报错;普通索引:仅加速查询,允许重复;全文索引(FULLTEXT):针对文本内容的关键词匹配(MATCH ... AGAINST),用于文章/搜索场景,5.7+ 支持中文需分词插件;空间索引(SPATIAL):地理数据(GEOMETRY)。前缀索引:对字符串列取前 N 字符建索引(节省空间,牺牲部分区分度)。选择:唯一性约束必须唯一索引;普通查询用普通索引;In…

6
# MySQL

MySQL 索引失效的场景有哪些?

① 对索引列使用函数/运算:WHERE YEAR(create_time)=2026 或 id+1=5;② 隐式类型转换:字符串列用数字比较(WHERE phone=123,phone 是 varchar 时可能失效或全表);③ 模糊查询前导通配:LIKE '%abc'('abc%' 可用);④ OR 连接非索引列:a=1 OR b=2 且 b 无索引(可用 UNION 优化);⑤ 联合索引不满足最左前缀:跳过最左列;⑥ 范围查询后列失…

7
# MySQL

MySQL 联合索引和最左前缀原则是什么?

联合索引(复合索引)idx(a, b, c):按 a、b、c 顺序建立 B+ 树(先按 a 排序,相同再按 b...)。最左前缀原则:查询必须从最左列开始连续匹配才能用到索引——能用:a、a+b、a+b+c;不能用:b、c、b+c(跳过了 a)。优化:① 查询条件按索引列顺序书写(优化器会调整等值顺序,但范围/排序不行);② 把最常用/区分度高的列放最左;③ 范围查询(>、<、between)后面的列无法继续用索引(MySQL 8 有索…

8
# MySQL

MySQL 覆盖索引是什么?有什么好处?

覆盖索引 = 查询所需的列全部包含在索引中,无需回表。例如 idx(name, age),SELECT name, age FROM t WHERE name='x' 时只扫描该索引即可返回,叶子节点已含 name/age(二级索引叶子有索引列+主键,若查询列 ⊆ {索引列, 主键} 即覆盖)。好处:① 减少回表 IO(少一次随机读);② 某些情况下可避免排序(索引有序);③ 性能显著提升。实践:高频查询设计联合索引使其覆盖(selec…

9
# MySQL

MySQL 聚簇索引和非聚簇索引(二级索引)有什么区别?

聚簇索引(InnoDB 主键索引):叶子节点存整行数据;表数据物理上按主键顺序组织;每个表只能有一个聚簇索引;无主键时用唯一非空索引,再没有用隐藏 rowid。二级索引(非聚簇):叶子节点存索引列 + 主键值;通过二级索引查非索引列需回表(根据主键回聚簇索引取整行)。MyISAM 的索引都是非聚簇(叶子存行指针,数据文件与索引文件分离)。理解:聚簇 = 数据即索引;二级 = 索引指向主键。

10
# MySQL

MySQL 为什么用 B+ 树做索引?

B+ 树适合磁盘索引:① 矮胖多叉:单节点存多个键(默认 16KB 页可存上千 key),树高仅 3-4 层,查询 3-4 次 IO 即可(千万级数据);② 非叶子节点只存 key 不存数据,能容纳更多分支,进一步降低树高;③ 叶子节点双向链表有序,范围查询/排序高效(SELECT ... BETWEEN);④ 叶子节点存数据/主键,查询稳定(都到叶子);对比:哈希索引只等值快不支持范围;二叉树高(IO 多);B 树非叶子也存数据(页存…