SuperAPI AI 工具集

mysql-patterns

数据与分析

查看项目

更新于 10-15 11:43

技能介绍

MySQL Patterns 是一个用于生产后端数据库工作的技能,覆盖 MySQL 与 MariaDB 的模式设计、迁移、慢查询排查、队列式事务、连接池以及生产数据库配置。其核心前提是:在应用某个特性相关的模式之前,先做精确的版本检查,因为 MySQL 与 MariaDB 在若干 SQL 细节上已经分化。

一、用途与激活场景 该技能适用于以下工作:设计 MySQL 或 MariaDB 的表、索引与约束;在大表上运行迁移之前进行审查;调试慢查询、锁等待、死锁或连接耗尽;添加键集分页、upsert、全文检索、JSON 列或队列;配置应用连接池、只读副本、TLS 或慢日志。

二、版本检查 开始时应先识别引擎与版本,可执行:SELECT VERSION(); 以及 SHOW VARIABLES LIKE 'version_comment';。当语法存在差异时,应把 MySQL 与 MariaDB 的指导分开:MySQL 文档将行别名作为 ON DUPLICATE KEY UPDATE 中 VALUES(col) 的替代,VALUES(col) 在 MySQL 中已弃用;MariaDB 文档则将 VALUES(col) 作为引用插入值的受支持方式,用于跨引擎兼容。SKIP LOCKED 仅适用于类队列工作,它会跳过被锁定的行并可能返回不一致视图,因此不应用于一般记账或对完整性敏感的读取。

三、模式默认值 资料给出 orders 表建表示例,默认选择包括:代理主键优先使用 BIGINT UNSIGNED AUTO_INCREMENT,避免在可能超过 20 亿行的表上使用 INT;UUID 查找键优先使用 BINARY(16) 配合转换辅助函数,避免在热表上使用 VARCHAR(36) 主键;金额与精确数量使用 DECIMAL(p, s),避免 FLOAT 或 DOUBLE;面向用户的文本使用 utf8mb4 表与索引,避免 MySQL 的 utf8 / utf8mb3 默认值;应用时间戳使用 DATETIME 并由应用管理 UTC,不要假设 DATETIME 存储时区元数据;软删除使用 deleted_at DATETIME NULL 加范围索引,避免在没有索引的情况下过滤软删除行;可扩展状态值使用查找表或带约束的 VARCHAR,当值频繁变化时避免 ENUM。

四、索引 复合索引顺序通常遵循等值谓词在前、范围或排序列在后。示例索引为 orders (account_id, status, created_at)。在添加或更改索引之前应使用 EXPLAIN。需要调查的信号包括:type 在大表上为 ALL;存在选择性谓词时 key 为 NULL;交互路径的 rows 估计值非常高;Extra 出现 Using temporary、Using filesort 或宽泛的 Using where。不要盲目添加索引,每个索引都会增加写入成本、迁移时间、备份大小和缓冲池压力。

五、查询模式 Upsert 提供两种形式:跨引擎兼容形式使用 VALUES(setting_value);MySQL 行别名形式使用 VALUES (?, ?, ?) AS new 并在更新中引用 new.setting_value。仅在确认目标为 MySQL 后使用行别名形式;对 MariaDB 或混合环境使用 VALUES(col)。 键集分页示例使用 WHERE (created_at, id) < (?, ?) 并按 created_at DESC, id DESC 排序,配合匹配游标的索引 idx_products_created_id。不要在大表上使用深层 OFFSET 分页。 JSON 字段用于扩展数据,而非需要大量关系过滤或约束的字段。对频繁查询的 JSON 路径,可暴露生成列并为其建立索引;外键、归属、租户和生命周期字段应保持关系化。 全文检索示例使用 FULLTEXT KEY 与 MATCH ... AGAINST ... IN NATURAL LANGUAGE MODE。当需要容错、复杂排序、跨表分面或超出内置全文行为的语言特定分析时,应使用外部搜索。

六、事务 事务应保持短小,并以一致顺序锁定行。资料给出账户转账示例,使用 START TRANSACTION、SELECT ... FOR UPDATE、UPDATE、COMMIT。死锁与锁等待检查清单包括:跨代码路径以确定性顺序锁定行;在开启事务之前而非之内进行外部 API 调用;为 UPDATE、DELETE 和锁定读取中使用的谓词添加索引;发生死锁时回滚并以有界重试预算重试整个事务;在死锁后尽快捕获 SHOW ENGINE INNODB STATUS\G,因为它会被后续事件覆盖。 队列式工作领取示例使用 SELECT ... FOR UPDATE SKIP LOCKED 与 UPDATE 将状态置为 processing。SKIP LOCKED 仅用于可接受跳过锁定行的类队列工作负载,不能替代正常的事务一致性。

七、连接池 资料给出 SQLAlchemy 与 Node.js mysql2 的连接池示例。应用池回收应低于服务器 wait_timeout;若服务器 wait_timeout = 300,则 pool_recycle 约 240 秒是协调的,pool_pre_ping 仍有助于从网络和故障转移事件中恢复。

八、诊断 常用首轮命令包括 SHOW FULL PROCESSLIST;、SHOW ENGINE INNODB STATUS\G;、SHOW VARIABLES LIKE 'slow_query_log';、SHOW VARIABLES LIKE 'long_query_time';。在受控环境中启用慢日志可设置 slow_query_log、long_query_time、log_queries_not_using_indexes。仅在安全执行查询时才使用 EXPLAIN ANALYZE,它会运行语句,在生产规模数据上可能开销很大。

九、复制 只读副本可能滞后。写入后不要立即将读己之写路径、结账流程、权限检查或幂等键读取路由到副本。资料给出 SHOW SLAVE STATUS\G 与 SHOW REPLICA STATUS\G 两种命令,并提示在标准化前检查引擎与版本。应监控副本 SQL 线程健康、IO 线程健康和延迟,而不仅仅是 TCP 连接是否存活。

十、安全 资料给出创建用户、授权、要求 SSL 以及清理匿名用户的示例。安全审查要点包括:不要向应用用户授予 ALL PRIVILEGES 或 .;当流量跨主机或网络时要求应用用户使用 TLS;将凭据存储在平台密钥管理器中,而非示例、脚本或仓库文件;将迁移/管理用户与运行时应用用户分离;在调优性能之前审计公网暴露和绑定地址。

十一、配置 资料给出专用数据库主机的示例起始配置,涵盖 innodb_buffer_pool_size、innodb_flush_log_at_trx_commit、sync_binlog、max_connections、thread_cache_size、wait_timeout、interactive_timeout、innodb_lock_wait_timeout、慢日志、log_bin、binlog_format、binlog_expire_logs_seconds 等。配置值应视为审查提示,而非通用预设;内存、连接、日志保留和持久性设置应根据工作负载、硬件、备份策略和恢复目标来确定。

十二、反模式 资料列出常见反模式及更优做法:热路径中的 SELECT * 应改为选择明确列;深层 OFFSET 分页应改为键集分页;外键连接无索引应有意为 FK 列建索引;长事务应改为提交小工作单元;直接对 mysql.user 做 DML 应改用 CREATE USER、ALTER USER、DROP USER;应用用户拥有管理员授权应改为最小权限运行时用户;池回收高于 wait_timeout 应改为低于超时并预检;写入后读副本应改为将读己之写流程固定到主库。

十三、输出期望 当该技能用于审查时,应返回:引擎/版本假设;最高风险的正确性、锁、安全和迁移问题;安全路径的确切 SQL 或代码更改;验证计划,包括 EXPLAIN、迁移试运行、锁/死锁检查和回滚标准;以及影响建议的任何 MySQL/MariaDB 语法差异。

十四、相关技能 资料列出相关技能:postgres-patterns(PostgreSQL 特定模式与查询模式)、database-migrations(迁移规划与发布安全)、backend-patterns(API 与服务层模式)、security-review(密钥处理、认证与最小权限),以及 agent:database-reviewer(更广泛的数据库审查工作流)。