SuperAPI AI 工具集

mysql-expert

数据与分析

查看项目

更新于 10-16 08:03

技能介绍

用途:面向 MySQL 与 MariaDB 的管理与开发,重点覆盖 InnoDB 内部机制、索引、查询调优、复制与在线表结构变更。

主要能力与要点:

  1. InnoDB 是数据库核心:表即主键 B-tree,二级索引都带主键,宽主键会放大所有索引;二级索引查找需两次遍历,除非索引覆盖查询。插入按主键顺序廉价,随机主键造成页分裂,故建议 BIGINT AUTO_INCREMENT 或时间有序 UUIDv7,避免随机 UUIDv4。
  2. 字符集统一用 utf8mb4;MySQL 的 utf8 是三字节子集,无法存 emoji 和部分 CJK 字符。排序规则 utf8mb4_0900_ai_ci 不区分重音与大小写,需要精确匹配(如 token、哈希)时用 utf8mb4_0900_as_cs 或 _bin。
  3. 隔离与锁:默认 REPEATABLE READ,比 PostgreSQL 更严格并使用间隙锁。可通过 SELECT @@transaction_isolation; 和 SET SESSION transaction_isolation = 'READ-COMMITTED'; 调整,READ COMMITTED 可减少间隙锁与死锁,但需测试,因其会改变基于语句的 binlog 语义。
  4. 索引设计:复合索引遵循最左前缀;列顺序为等值条件优先、再范围或排序列、最后仅用于覆盖的列。函数包裹列、字符串与整数列比较、前导通配符 LIKE、低选择性否定等会静默失效索引。用 EXPLAIN 和 EXPLAIN ANALYZE(8.0.18+)读执行计划,Extra: Using index 表示覆盖索引。
  5. 慢查询:开启 slow_query_log、long_query_time,或查询 performance_schema.events_statements_summary_by_digest;其中 examined_per_row 偏高通常说明索引问题。
  6. 锁与死锁:用 SHOW ENGINE INNODB STATUS\G 与 performance_schema.data_lock_waits 排查;死锁在高并发下属正常,应用需退避重试,并保持加锁顺序一致、事务短小。
  7. 在线表结构变更:执行 ALTER TABLE 时显式声明 ALGORITHM=INPLACE, LOCK=NONE,使无法在线时拒绝而非静默降级为阻塞复制;无法在线时可用 pt-online-schema-change,建议先 --dry-run 并确认外键处理。
  8. 复制:用 GTID 与基于行的 binlog,binlog_format=ROW、binlog_row_image=MINIMAL、sync_binlog=1、innodb_flush_log_at_trx_commit=1。副本默认异步,写后立即读可能看不到;可将写后读路由到主库,或用半同步复制。

最佳实践:开启严格模式(sql_mode 含 STRICT_TRANS_TABLES)、全链路 utf8mb4、窄且单调的主键、加索引前先看执行计划并删除无用索引、保持事务短小、应用层重试死锁、验证备份可恢复、在配置中固定 SQL 模式与时区。

反模式:utf8 替代 utf8mb4、用 FLOAT/DOUBLE 存金额、大写入表用 UUIDv4 作聚簇主键、SELECT *、谓词中对索引列用函数、ORDER BY RAND()、深分页 OFFSET,以及未经检查算法就执行阻塞 ALTER。

限制:以上为通用设计实践,具体版本行为、复制拓扑与工具参数需结合实际环境验证。资料未提供的具体版本兼容范围、价格与平台支持信息暂未提供。