pdd-skills 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1478 -0
- package/bin/pdd.js +354 -0
- package/config/bpmn-rules.yaml +166 -0
- package/config/checkstyle.xml +105 -0
- package/config/eslint.config.js +48 -0
- package/config/pmd.xml +91 -0
- package/config/prd-rules.yaml +113 -0
- package/config/ruff.toml +45 -0
- package/config/sqlfluff.cfg +82 -0
- package/hooks/hook-executor.js +332 -0
- package/index.js +43 -0
- package/lib/api-routes.js +750 -0
- package/lib/api-server.js +408 -0
- package/lib/cache/cache-config.js +209 -0
- package/lib/cache/system-cache.js +852 -0
- package/lib/config-manager.js +373 -0
- package/lib/generate.js +528 -0
- package/lib/grpc/grpc-routes.js +1134 -0
- package/lib/grpc/grpc-server.js +912 -0
- package/lib/grpc/proto-definitions.js +1033 -0
- package/lib/init.js +172 -0
- package/lib/iteration/auto-fixer.js +1025 -0
- package/lib/iteration/auto-reviewer.js +923 -0
- package/lib/iteration/controller.js +577 -0
- package/lib/list.js +130 -0
- package/lib/mcp-server.js +548 -0
- package/lib/openclaw/api-integration.js +535 -0
- package/lib/openclaw/cli-integration.js +567 -0
- package/lib/openclaw/data-sync.js +845 -0
- package/lib/openclaw/openclaw-adapter.js +783 -0
- package/lib/plugin/example-plugins/code-stats/index.js +332 -0
- package/lib/plugin/example-plugins/code-stats/plugin.json +1 -0
- package/lib/plugin/example-plugins/custom-linter/index.js +472 -0
- package/lib/plugin/example-plugins/custom-linter/plugin.json +1 -0
- package/lib/plugin/example-plugins/hello-world/index.js +86 -0
- package/lib/plugin/example-plugins/hello-world/plugin.json +1 -0
- package/lib/plugin/plugin-manager.js +655 -0
- package/lib/plugin/plugin-sdk.js +565 -0
- package/lib/plugin/sandbox.js +627 -0
- package/lib/quality/rules/maintainability.js +418 -0
- package/lib/quality/rules/performance.js +498 -0
- package/lib/quality/rules/readability.js +441 -0
- package/lib/quality/rules/robustness.js +504 -0
- package/lib/quality/rules/security.js +444 -0
- package/lib/quality/scorer.js +576 -0
- package/lib/report.js +669 -0
- package/lib/sdk-base.js +301 -0
- package/lib/sdk-js.js +446 -0
- package/lib/sdk-python/README.md +546 -0
- package/lib/sdk-python/examples/basic_usage.py +450 -0
- package/lib/sdk-python/pdd_sdk/__init__.py +180 -0
- package/lib/sdk-python/pdd_sdk/client.py +1170 -0
- package/lib/sdk-python/pdd_sdk/events.py +423 -0
- package/lib/sdk-python/pdd_sdk/exceptions.py +158 -0
- package/lib/sdk-python/pdd_sdk/models.py +518 -0
- package/lib/sdk-python/pdd_sdk/utils.py +759 -0
- package/lib/token/budget-alert.js +367 -0
- package/lib/token/budget-manager.js +485 -0
- package/lib/update.js +54 -0
- package/lib/utils/logger.js +88 -0
- package/lib/verify.js +741 -0
- package/lib/version.js +52 -0
- package/lib/vm/README.md +102 -0
- package/lib/vm/dashboard/api-routes.js +669 -0
- package/lib/vm/dashboard/server.js +391 -0
- package/lib/vm/dashboard/sse.js +358 -0
- package/lib/vm/dashboard/static/css/dashboard.css +1378 -0
- package/lib/vm/dashboard/static/index.html +118 -0
- package/lib/vm/dashboard/static/js/app.js +949 -0
- package/lib/vm/dashboard/static/js/charts.js +913 -0
- package/lib/vm/dashboard/static/js/kanban-view.js +1053 -0
- package/lib/vm/dashboard/static/js/pipeline-view.js +463 -0
- package/lib/vm/dashboard/static/js/quality-view.js +598 -0
- package/lib/vm/dashboard/static/js/system-view.js +1021 -0
- package/lib/vm/data-provider.js +1191 -0
- package/lib/vm/event-bus.js +402 -0
- package/lib/vm/hooks/extract-hook.js +307 -0
- package/lib/vm/hooks/generate-hook.js +374 -0
- package/lib/vm/hooks/hook-interface.js +458 -0
- package/lib/vm/hooks/report-hook.js +331 -0
- package/lib/vm/hooks/verify-hook.js +454 -0
- package/lib/vm/models.js +1003 -0
- package/lib/vm/reconciler.js +855 -0
- package/lib/vm/scanner.js +988 -0
- package/lib/vm/state-schema.js +955 -0
- package/lib/vm/state-store.js +733 -0
- package/lib/vm/tui/components/card.js +339 -0
- package/lib/vm/tui/components/progress-bar.js +368 -0
- package/lib/vm/tui/components/sparkline.js +327 -0
- package/lib/vm/tui/components/status-light.js +294 -0
- package/lib/vm/tui/components/table.js +370 -0
- package/lib/vm/tui/input.js +335 -0
- package/lib/vm/tui/renderer.js +548 -0
- package/lib/vm/tui/screens/kanban-screen.js +397 -0
- package/lib/vm/tui/screens/overview-screen.js +357 -0
- package/lib/vm/tui/screens/quality-screen.js +336 -0
- package/lib/vm/tui/screens/system-screen.js +379 -0
- package/lib/vm/tui/tui.js +805 -0
- package/package.json +1 -0
- package/scripts/cso-analyzer.js +198 -0
- package/scripts/eval-runner.js +359 -0
- package/scripts/i18n-checker.js +109 -0
- package/scripts/linter/activiti-linter.js +272 -0
- package/scripts/linter/prd-linter.js +162 -0
- package/scripts/linter/report-generator.js +207 -0
- package/scripts/linter/run-linters.js +285 -0
- package/scripts/linter/sql-linter.js +166 -0
- package/scripts/token-analyzer.js +162 -0
- package/scripts/vm-test.js +180 -0
- package/skills/core/official-doc-writer/LICENSE +21 -0
- package/skills/core/official-doc-writer/README.md +232 -0
- package/skills/core/official-doc-writer/SKILL.md +475 -0
- package/skills/core/official-doc-writer/_meta.json +1 -0
- package/skills/core/official-doc-writer/document_generator.py +580 -0
- package/skills/core/official-doc-writer/evals/default-evals.json +1 -0
- package/skills/core/official-doc-writer/examples.md +150 -0
- package/skills/core/official-doc-writer/fonts/FONTS_LIST.md +45 -0
- package/skills/core/official-doc-writer/fonts/README.md +141 -0
- package/skills/core/official-doc-writer/fonts/SIMFANG.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMHEI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMKAI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMSUN.TTC +0 -0
- package/skills/core/official-doc-writer/fonts//346/226/271/346/255/243/345/260/217/346/240/207/345/256/213GBK.TTF +0 -0
- package/skills/core/official-doc-writer/references/GBT_9704-2012_/345/205/232/346/224/277/346/234/272/345/205/263/345/205/254/346/226/207/346/240/274/345/274/217.md +422 -0
- package/skills/core/official-doc-writer/scripts/__pycache__/generate_official_doc.cpython-313.pyc +0 -0
- package/skills/core/official-doc-writer/scripts/dialog_manager.py +564 -0
- package/skills/core/official-doc-writer/scripts/generate_official_doc.py +252 -0
- package/skills/core/official-doc-writer/scripts/install_fonts.py +390 -0
- package/skills/core/official-doc-writer/scripts/smart_prompts.py +363 -0
- package/skills/core/pdd-ba/SKILL.md +305 -0
- package/skills/core/pdd-ba/_meta.json +1 -0
- package/skills/core/pdd-ba/evals/default-evals.json +1 -0
- package/skills/core/pdd-code-reviewer/SKILL.md +378 -0
- package/skills/core/pdd-code-reviewer/_meta.json +1 -0
- package/skills/core/pdd-code-reviewer/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-change/SKILL.md +350 -0
- package/skills/core/pdd-doc-change/_meta.json +1 -0
- package/skills/core/pdd-doc-change/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-gardener/SKILL.md +248 -0
- package/skills/core/pdd-doc-gardener/_meta.json +1 -0
- package/skills/core/pdd-doc-gardener/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/SKILL.md +360 -0
- package/skills/core/pdd-entropy-reduction/_meta.json +1 -0
- package/skills/core/pdd-entropy-reduction/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/references/entropy-report-template.md +287 -0
- package/skills/core/pdd-entropy-reduction/references/golden-principles.md +573 -0
- package/skills/core/pdd-entropy-reduction/scripts/entropy_scan.py +712 -0
- package/skills/core/pdd-extract-features/SKILL.md +320 -0
- package/skills/core/pdd-extract-features/_meta.json +1 -0
- package/skills/core/pdd-extract-features/evals/default-evals.json +1 -0
- package/skills/core/pdd-generate-spec/SKILL.md +418 -0
- package/skills/core/pdd-generate-spec/_meta.json +1 -0
- package/skills/core/pdd-generate-spec/evals/default-evals.json +1 -0
- package/skills/core/pdd-implement-feature/SKILL.md +332 -0
- package/skills/core/pdd-implement-feature/_meta.json +1 -0
- package/skills/core/pdd-implement-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/SKILL.md +540 -0
- package/skills/core/pdd-main/_meta.json +1 -0
- package/skills/core/pdd-main/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/evals/evals.json +215 -0
- package/skills/core/pdd-verify-feature/SKILL.md +474 -0
- package/skills/core/pdd-verify-feature/_meta.json +1 -0
- package/skills/core/pdd-verify-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-vm/evals/default-evals.json +1 -0
- package/skills/core/traffic-accident-assessor/LICENSE +29 -0
- package/skills/core/traffic-accident-assessor/SKILL.md +439 -0
- package/skills/core/traffic-accident-assessor/evals/evals.json +1 -0
- package/skills/core/traffic-accident-assessor/references/accident-types.md +369 -0
- package/skills/core/traffic-accident-assessor/references/liability-rules.md +287 -0
- package/skills/core/traffic-accident-assessor/references/traffic-laws.md +226 -0
- package/skills/core/traffic-accident-assessor/references//351/253/230/345/260/224/345/244/253/350/257/264/346/230/216/344/271/246.pdf +32576 -106
- package/skills/core/traffic-accident-assessor/scripts/generate_official_statement.py +588 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_report.py +495 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_statement.py +528 -0
- package/skills/core/traffic-accident-assessor.zip +0 -0
- package/skills/entropy/expert-arch-enforcer/SKILL.md +292 -0
- package/skills/entropy/expert-arch-enforcer/_meta.json +1 -0
- package/skills/entropy/expert-arch-enforcer/evals/default-evals.json +1 -0
- package/skills/entropy/expert-auto-refactor/SKILL.md +327 -0
- package/skills/entropy/expert-auto-refactor/_meta.json +1 -0
- package/skills/entropy/expert-auto-refactor/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/SKILL.md +468 -0
- package/skills/entropy/expert-code-quality/_meta.json +1 -0
- package/skills/entropy/expert-code-quality/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/evals/evals.json +109 -0
- package/skills/entropy/expert-code-quality/references/code-smells.md +605 -0
- package/skills/entropy/expert-code-quality/references/design-patterns.md +1111 -0
- package/skills/entropy/expert-code-quality/references/refactoring-catalog.md +1281 -0
- package/skills/entropy/expert-code-quality/references/solid-principles.md +524 -0
- package/skills/entropy/expert-entropy-auditor/SKILL.md +276 -0
- package/skills/entropy/expert-entropy-auditor/_meta.json +1 -0
- package/skills/entropy/expert-entropy-auditor/evals/default-evals.json +1 -0
- package/skills/expert/expert-activiti/SKILL.md +497 -0
- package/skills/expert/expert-activiti/_meta.json +1 -0
- package/skills/expert/expert-mysql/SKILL.md +832 -0
- package/skills/expert/expert-mysql/_meta.json +1 -0
- package/skills/expert/expert-performance/SKILL.md +379 -0
- package/skills/expert/expert-performance/_meta.json +1 -0
- package/skills/expert/expert-performance/evals/default-evals.json +1 -0
- package/skills/expert/expert-ruoyi/SKILL.md +472 -0
- package/skills/expert/expert-ruoyi/_meta.json +1 -0
- package/skills/expert/expert-security/SKILL.md +1341 -0
- package/skills/expert/expert-security/_meta.json +1 -0
- package/skills/expert/expert-security/evals/default-evals.json +1 -0
- package/skills/expert/software-architect/SKILL.md +350 -0
- package/skills/expert/software-architect/_meta.json +1 -0
- package/skills/expert/software-engineer/SKILL.md +437 -0
- package/skills/expert/software-engineer/_meta.json +1 -0
- package/skills/expert/software-engineer/architecture.md +130 -0
- package/skills/expert/software-engineer/patterns.md +151 -0
- package/skills/expert/software-engineer/testing.md +135 -0
- package/skills/expert/system-architect/SKILL.md +628 -0
- package/skills/expert/system-architect/_meta.json +1 -0
- package/skills/expert/system-architect/assets/templates/ARCHITECTURE.md +25 -0
- package/skills/expert/system-architect/assets/templates/README.md +44 -0
- package/skills/expert/system-architect/references/js-ts-standards.md +18 -0
- package/skills/expert/system-architect/references/python-standards.md +19 -0
- package/skills/expert/system-architect/references/scaffolding.md +61 -0
- package/skills/expert/system-architect/references/security-checklist.md +21 -0
- package/skills/openspec/openspec-apply-change/SKILL.md +156 -0
- package/skills/openspec/openspec-apply-change/_meta.json +1 -0
- package/skills/openspec/openspec-archive-change/SKILL.md +114 -0
- package/skills/openspec/openspec-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
- package/skills/openspec/openspec-bulk-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-continue-change/SKILL.md +118 -0
- package/skills/openspec/openspec-continue-change/_meta.json +1 -0
- package/skills/openspec/openspec-explore/SKILL.md +288 -0
- package/skills/openspec/openspec-explore/_meta.json +1 -0
- package/skills/openspec/openspec-ff-change/SKILL.md +101 -0
- package/skills/openspec/openspec-ff-change/_meta.json +1 -0
- package/skills/openspec/openspec-new-change/SKILL.md +74 -0
- package/skills/openspec/openspec-new-change/_meta.json +1 -0
- package/skills/openspec/openspec-onboard/SKILL.md +554 -0
- package/skills/openspec/openspec-onboard/_meta.json +1 -0
- package/skills/openspec/openspec-sync-specs/SKILL.md +138 -0
- package/skills/openspec/openspec-sync-specs/_meta.json +1 -0
- package/skills/openspec/openspec-verify-change/SKILL.md +168 -0
- package/skills/openspec/openspec-verify-change/_meta.json +1 -0
- package/skills/pr/pdd-multi-review/SKILL.md +534 -0
- package/skills/pr/pdd-multi-review/_meta.json +1 -0
- package/skills/pr/pdd-pr-batch/SKILL.md +303 -0
- package/skills/pr/pdd-pr-batch/_meta.json +1 -0
- package/skills/pr/pdd-pr-create/SKILL.md +344 -0
- package/skills/pr/pdd-pr-create/_meta.json +1 -0
- package/skills/pr/pdd-pr-merge/SKILL.md +286 -0
- package/skills/pr/pdd-pr-merge/_meta.json +1 -0
- package/skills/pr/pdd-pr-review/SKILL.md +217 -0
- package/skills/pr/pdd-pr-review/_meta.json +1 -0
- package/skills/pr/pdd-task-manager/SKILL.md +636 -0
- package/skills/pr/pdd-task-manager/_meta.json +1 -0
- package/skills/pr/pdd-template-engine/SKILL.md +306 -0
- package/skills/pr/pdd-template-engine/_meta.json +1 -0
- package/templates/behavior-shaping/iron-law-template.md +87 -0
- package/templates/behavior-shaping/rationalization-template.md +62 -0
- package/templates/behavior-shaping/red-flags-template.md +70 -0
- package/templates/bilingual-template.md +139 -0
- package/templates/config/default.yaml +47 -0
- package/templates/project/default/README.md +31 -0
- package/templates/project/frontend/README.md +46 -0
- package/templates/project/java/README.md +48 -0
|
@@ -0,0 +1,832 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: expert-mysql
|
|
3
|
+
description: MySQL数据库专家提供SQL优化、索引设计和表结构分析服务。当用户需要SQL优化或数据库设计时调用此技能。支持中文触发:SQL优化、数据库设计、索引优化、慢查询分析。
|
|
4
|
+
license: MIT
|
|
5
|
+
author: "neuqik@hotmail.com"
|
|
6
|
+
version: "2.0"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# MySQL 数据库专家
|
|
10
|
+
|
|
11
|
+
## 概述
|
|
12
|
+
|
|
13
|
+
本技能提供专业的 MySQL 数据库相关服务,包括 SQL 查询优化、数据库表结构设计、索引优化、存储过程编写等。基于 MySQL 官方文档提供权威的技术支持。
|
|
14
|
+
|
|
15
|
+
## 目录结构
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
expert-mysql/
|
|
19
|
+
├── SKILL.md # 技能定义文件
|
|
20
|
+
├── LICENSE # MIT 许可证
|
|
21
|
+
├── README.md # 说明文档
|
|
22
|
+
└── references/ # 参考文档
|
|
23
|
+
├── mysql80/ # MySQL 8.0 文档摘要
|
|
24
|
+
└── mysql94/ # MySQL 9.4 文档摘要
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 触发条件
|
|
28
|
+
|
|
29
|
+
**自动触发:**
|
|
30
|
+
- 用户询问 SQL 查询优化
|
|
31
|
+
- 需要设计或修改数据库表结构
|
|
32
|
+
- 索引相关问题
|
|
33
|
+
- 存储过程编写
|
|
34
|
+
- 数据库性能问题分析
|
|
35
|
+
|
|
36
|
+
**手动触发:**
|
|
37
|
+
- 用户输入 `/mysql`、`/sql`、`/database` 等命令
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 核心能力
|
|
42
|
+
|
|
43
|
+
### 1. SQL 查询优化
|
|
44
|
+
|
|
45
|
+
#### 1.1 查询分析工具
|
|
46
|
+
|
|
47
|
+
**EXPLAIN 分析:**
|
|
48
|
+
```sql
|
|
49
|
+
-- 基本用法
|
|
50
|
+
EXPLAIN SELECT * FROM users WHERE name = 'John';
|
|
51
|
+
|
|
52
|
+
-- 详细分析(MySQL 8.0.18+)
|
|
53
|
+
EXPLAIN ANALYZE SELECT * FROM users WHERE name = 'John';
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**EXPLAIN 输出解读:**
|
|
57
|
+
|
|
58
|
+
| 列名 | 说明 | 关注点 |
|
|
59
|
+
|------|------|--------|
|
|
60
|
+
| id | 查询标识 | 子查询顺序 |
|
|
61
|
+
| select_type | 查询类型 | 避免DEPENDENT SUBQUERY |
|
|
62
|
+
| table | 表名 | 关联表顺序 |
|
|
63
|
+
| type | 访问类型 | 目标:ref, range, index |
|
|
64
|
+
| possible_keys | 可能使用的索引 | - |
|
|
65
|
+
| key | 实际使用的索引 | 是否命中索引 |
|
|
66
|
+
| key_len | 索引长度 | 越短越好 |
|
|
67
|
+
| rows | 预估扫描行数 | 越少越好 |
|
|
68
|
+
| Extra | 额外信息 | 避免Using filesort, Using temporary |
|
|
69
|
+
|
|
70
|
+
#### 1.2 常见优化场景
|
|
71
|
+
|
|
72
|
+
**场景1:避免 SELECT ***
|
|
73
|
+
```sql
|
|
74
|
+
-- 不推荐
|
|
75
|
+
SELECT * FROM orders WHERE status = 'pending';
|
|
76
|
+
|
|
77
|
+
-- 推荐
|
|
78
|
+
SELECT id, customer_id, total_amount
|
|
79
|
+
FROM orders
|
|
80
|
+
WHERE status = 'pending';
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**场景2:优化 JOIN**
|
|
84
|
+
```sql
|
|
85
|
+
-- 确保关联字段有索引
|
|
86
|
+
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
|
|
87
|
+
|
|
88
|
+
-- 使用 INNER JOIN 替代 WHERE 关联
|
|
89
|
+
SELECT o.*, c.name
|
|
90
|
+
FROM orders o
|
|
91
|
+
INNER JOIN customers c ON o.customer_id = c.id
|
|
92
|
+
WHERE o.status = 'pending';
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**场景3:子查询优化**
|
|
96
|
+
```sql
|
|
97
|
+
-- 不推荐:相关子查询
|
|
98
|
+
SELECT * FROM orders o1
|
|
99
|
+
WHERE total_amount > (
|
|
100
|
+
SELECT AVG(total_amount) FROM orders o2
|
|
101
|
+
WHERE o2.customer_id = o1.customer_id
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
-- 推荐:JOIN + 子查询
|
|
105
|
+
SELECT o.*
|
|
106
|
+
FROM orders o
|
|
107
|
+
JOIN (
|
|
108
|
+
SELECT customer_id, AVG(total_amount) as avg_amount
|
|
109
|
+
FROM orders
|
|
110
|
+
GROUP BY customer_id
|
|
111
|
+
) avg ON o.customer_id = avg.customer_id
|
|
112
|
+
WHERE o.total_amount > avg.avg_amount;
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**场景4:分页优化**
|
|
116
|
+
```sql
|
|
117
|
+
-- 传统分页(大数据量慢)
|
|
118
|
+
SELECT * FROM orders ORDER BY id LIMIT 10000, 20;
|
|
119
|
+
|
|
120
|
+
-- 优化分页(使用索引)
|
|
121
|
+
SELECT o.* FROM orders o
|
|
122
|
+
JOIN (SELECT id FROM orders ORDER BY id LIMIT 10000, 20) t
|
|
123
|
+
ON o.id = t.id;
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
### 2. 索引设计
|
|
129
|
+
|
|
130
|
+
#### 2.1 索引类型
|
|
131
|
+
|
|
132
|
+
| 类型 | 说明 | 适用场景 |
|
|
133
|
+
|------|------|---------|
|
|
134
|
+
| PRIMARY KEY | 主键索引 | 唯一标识 |
|
|
135
|
+
| UNIQUE | 唯一索引 | 唯一约束 |
|
|
136
|
+
| INDEX | 普通索引 | 加速查询 |
|
|
137
|
+
| FULLTEXT | 全文索引 | 文本搜索 |
|
|
138
|
+
| SPATIAL | 空间索引 | 地理位置 |
|
|
139
|
+
|
|
140
|
+
#### 2.2 索引设计原则
|
|
141
|
+
|
|
142
|
+
1. **选择性原则**:选择性高的列优先
|
|
143
|
+
```sql
|
|
144
|
+
-- 计算选择性
|
|
145
|
+
SELECT COUNT(DISTINCT column_name) / COUNT(*) FROM table_name;
|
|
146
|
+
-- 越接近1,选择性越高
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
2. **最左前缀原则**:复合索引从左匹配
|
|
150
|
+
```sql
|
|
151
|
+
-- 复合索引
|
|
152
|
+
CREATE INDEX idx_name_status_create ON orders(customer_name, status, create_time);
|
|
153
|
+
|
|
154
|
+
-- 命中索引
|
|
155
|
+
WHERE customer_name = 'John'
|
|
156
|
+
WHERE customer_name = 'John' AND status = 'pending'
|
|
157
|
+
|
|
158
|
+
-- 不命中索引
|
|
159
|
+
WHERE status = 'pending'
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
3. **覆盖索引原则**:查询字段都在索引中
|
|
163
|
+
```sql
|
|
164
|
+
-- 覆盖索引
|
|
165
|
+
CREATE INDEX idx_covering ON orders(status, total_amount);
|
|
166
|
+
|
|
167
|
+
-- 查询只使用索引列
|
|
168
|
+
SELECT status, total_amount FROM orders WHERE status = 'pending';
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### 2.3 索引失效场景
|
|
172
|
+
|
|
173
|
+
| 场景 | 示例 | 解决方案 |
|
|
174
|
+
|------|------|---------|
|
|
175
|
+
| 使用函数 | `WHERE YEAR(create_time) = 2024` | 改用范围查询 |
|
|
176
|
+
| 隐式转换 | `WHERE phone = 13800138000`(字符串字段) | 加引号 |
|
|
177
|
+
| LIKE 左模糊 | `WHERE name LIKE '%John'` | 使用全文索引 |
|
|
178
|
+
| OR 条件 | `WHERE name = 'John' OR age = 20` | 使用 UNION |
|
|
179
|
+
| NOT 条件 | `WHERE status != 'deleted'` | 改用 IN |
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
### 3. 表结构设计
|
|
184
|
+
|
|
185
|
+
#### 3.1 数据类型选择
|
|
186
|
+
|
|
187
|
+
| 类型 | 存储 | 范围 | 适用场景 |
|
|
188
|
+
|------|------|------|---------|
|
|
189
|
+
| TINYINT | 1字节 | -128~127 | 状态、标志 |
|
|
190
|
+
| SMALLINT | 2字节 | -32768~32767 | 计数、数量 |
|
|
191
|
+
| INT | 4字节 | -21亿~21亿 | 主键、ID |
|
|
192
|
+
| BIGINT | 8字节 | 非常大 | 大数据量主键 |
|
|
193
|
+
| VARCHAR(n) | 可变 | n字符 | 字符串 |
|
|
194
|
+
| TEXT | 可变 | 64KB | 长文本 |
|
|
195
|
+
| DATETIME | 8字节 | 1000~9999年 | 时间 |
|
|
196
|
+
| TIMESTAMP | 4字节 | 1970~2038年 | 时间戳 |
|
|
197
|
+
|
|
198
|
+
#### 3.2 范式设计
|
|
199
|
+
|
|
200
|
+
**第一范式(1NF)**:字段不可分割
|
|
201
|
+
|
|
202
|
+
**第二范式(2NF)**:消除部分依赖
|
|
203
|
+
```sql
|
|
204
|
+
-- 不符合2NF
|
|
205
|
+
CREATE TABLE orders (
|
|
206
|
+
id INT,
|
|
207
|
+
customer_id INT,
|
|
208
|
+
customer_name VARCHAR(100), -- 依赖customer_id
|
|
209
|
+
product_id INT,
|
|
210
|
+
product_name VARCHAR(100), -- 依赖product_id
|
|
211
|
+
PRIMARY KEY (id)
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
-- 符合2NF
|
|
215
|
+
CREATE TABLE orders (
|
|
216
|
+
id INT PRIMARY KEY,
|
|
217
|
+
customer_id INT,
|
|
218
|
+
product_id INT
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
CREATE TABLE customers (
|
|
222
|
+
id INT PRIMARY KEY,
|
|
223
|
+
name VARCHAR(100)
|
|
224
|
+
);
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**第三范式(3NF)**:消除传递依赖
|
|
228
|
+
|
|
229
|
+
#### 3.3 反范式设计
|
|
230
|
+
|
|
231
|
+
适当冗余提升查询性能:
|
|
232
|
+
```sql
|
|
233
|
+
-- 订单表冗余客户名称
|
|
234
|
+
CREATE TABLE orders (
|
|
235
|
+
id INT PRIMARY KEY,
|
|
236
|
+
customer_id INT,
|
|
237
|
+
customer_name VARCHAR(100), -- 冗余字段
|
|
238
|
+
total_amount DECIMAL(10,2),
|
|
239
|
+
create_time DATETIME
|
|
240
|
+
);
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
### 4. 性能优化
|
|
246
|
+
|
|
247
|
+
#### 4.1 慢查询分析
|
|
248
|
+
|
|
249
|
+
```sql
|
|
250
|
+
-- 开启慢查询日志
|
|
251
|
+
SET GLOBAL slow_query_log = 'ON';
|
|
252
|
+
SET GLOBAL long_query_time = 2; -- 2秒以上
|
|
253
|
+
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
|
|
254
|
+
|
|
255
|
+
-- 查看慢查询
|
|
256
|
+
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
#### 4.2 连接池优化
|
|
260
|
+
|
|
261
|
+
```properties
|
|
262
|
+
# 推荐配置
|
|
263
|
+
spring.datasource.hikari.maximum-pool-size=20
|
|
264
|
+
spring.datasource.hikari.minimum-idle=5
|
|
265
|
+
spring.datasource.hikari.idle-timeout=300000
|
|
266
|
+
spring.datasource.hikari.connection-timeout=30000
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
#### 4.3 缓存优化
|
|
270
|
+
|
|
271
|
+
```sql
|
|
272
|
+
-- 查询缓存(MySQL 8.0已移除,建议使用应用层缓存)
|
|
273
|
+
-- 使用 Redis 缓存热点数据
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
### 5. 高级特性
|
|
279
|
+
|
|
280
|
+
#### 5.1 窗口函数(MySQL 8.0+)
|
|
281
|
+
|
|
282
|
+
```sql
|
|
283
|
+
-- 排名
|
|
284
|
+
SELECT
|
|
285
|
+
name,
|
|
286
|
+
score,
|
|
287
|
+
RANK() OVER (ORDER BY score DESC) as rank,
|
|
288
|
+
DENSE_RANK() OVER (ORDER BY score DESC) as dense_rank,
|
|
289
|
+
ROW_NUMBER() OVER (ORDER BY score DESC) as row_num
|
|
290
|
+
FROM students;
|
|
291
|
+
|
|
292
|
+
-- 分组聚合
|
|
293
|
+
SELECT
|
|
294
|
+
department,
|
|
295
|
+
name,
|
|
296
|
+
salary,
|
|
297
|
+
AVG(salary) OVER (PARTITION BY department) as dept_avg,
|
|
298
|
+
salary - AVG(salary) OVER (PARTITION BY department) as diff
|
|
299
|
+
FROM employees;
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### 5.2 CTE 公用表表达式(MySQL 8.0+)
|
|
303
|
+
|
|
304
|
+
```sql
|
|
305
|
+
-- 非递归CTE
|
|
306
|
+
WITH monthly_sales AS (
|
|
307
|
+
SELECT
|
|
308
|
+
DATE_FORMAT(order_date, '%Y-%m') as month,
|
|
309
|
+
SUM(amount) as total
|
|
310
|
+
FROM orders
|
|
311
|
+
GROUP BY month
|
|
312
|
+
)
|
|
313
|
+
SELECT * FROM monthly_sales WHERE total > 10000;
|
|
314
|
+
|
|
315
|
+
-- 递归CTE(层级查询)
|
|
316
|
+
WITH RECURSIVE org_tree AS (
|
|
317
|
+
SELECT id, name, manager_id, 1 as level
|
|
318
|
+
FROM employees WHERE manager_id IS NULL
|
|
319
|
+
|
|
320
|
+
UNION ALL
|
|
321
|
+
|
|
322
|
+
SELECT e.id, e.name, e.manager_id, t.level + 1
|
|
323
|
+
FROM employees e
|
|
324
|
+
JOIN org_tree t ON e.manager_id = t.id
|
|
325
|
+
)
|
|
326
|
+
SELECT * FROM org_tree;
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### 5.3 JSON 支持(MySQL 5.7+)
|
|
330
|
+
|
|
331
|
+
```sql
|
|
332
|
+
-- 创建JSON列
|
|
333
|
+
CREATE TABLE products (
|
|
334
|
+
id INT PRIMARY KEY,
|
|
335
|
+
name VARCHAR(100),
|
|
336
|
+
attributes JSON
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
-- 插入JSON数据
|
|
340
|
+
INSERT INTO products VALUES (1, 'iPhone', '{"color": "black", "storage": 128}');
|
|
341
|
+
|
|
342
|
+
-- 查询JSON
|
|
343
|
+
SELECT name, attributes->>'$.color' as color FROM products;
|
|
344
|
+
|
|
345
|
+
-- JSON函数
|
|
346
|
+
SELECT
|
|
347
|
+
JSON_EXTRACT(attributes, '$.storage') as storage,
|
|
348
|
+
JSON_SET(attributes, '$.price', 999) as with_price,
|
|
349
|
+
JSON_REMOVE(attributes, '$.color') as no_color
|
|
350
|
+
FROM products;
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
### 6. 事务管理
|
|
356
|
+
|
|
357
|
+
#### 6.1 事务隔离级别
|
|
358
|
+
|
|
359
|
+
| 隔离级别 | 说明 | 脏读 | 不可重复读 | 幻读 |
|
|
360
|
+
|---------|------|------|-----------|------|
|
|
361
|
+
| READ UNCOMMITTED | 读未提交 | ✗ | ✗ | ✗ |
|
|
362
|
+
| READ COMMITTED | 读已提交 | ✓ | ✗ | ✗ |
|
|
363
|
+
| REPEATABLE READ | 可重复读(默认) | ✓ | ✓ | ✗ |
|
|
364
|
+
| SERIALIZABLE | 串行化 | ✓ | ✓ | ✓ |
|
|
365
|
+
|
|
366
|
+
**查看当前隔离级别**:
|
|
367
|
+
```sql
|
|
368
|
+
SELECT @@transaction_isolation;
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**设置隔离级别**:
|
|
372
|
+
```sql
|
|
373
|
+
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
#### 6.2 锁机制
|
|
377
|
+
|
|
378
|
+
**锁类型**:
|
|
379
|
+
|
|
380
|
+
| 锁类型 | 说明 | 适用场景 |
|
|
381
|
+
|--------|------|---------|
|
|
382
|
+
| 共享锁(S锁) | 允许读,阻止写 | SELECT ... LOCK IN SHARE MODE |
|
|
383
|
+
| 排他锁(X锁) | 阻止读写 | SELECT ... FOR UPDATE |
|
|
384
|
+
| 意向锁 | 表级锁,标识行锁意图 | 自动添加 |
|
|
385
|
+
| 间隙锁 | 锁定范围,防止幻读 | REPEATABLE READ |
|
|
386
|
+
|
|
387
|
+
**锁示例**:
|
|
388
|
+
```sql
|
|
389
|
+
-- 共享锁
|
|
390
|
+
SELECT * FROM orders WHERE id = 1 LOCK IN SHARE MODE;
|
|
391
|
+
|
|
392
|
+
-- 排他锁
|
|
393
|
+
SELECT * FROM orders WHERE id = 1 FOR UPDATE;
|
|
394
|
+
|
|
395
|
+
-- 查看锁等待
|
|
396
|
+
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
#### 6.3 死锁处理
|
|
400
|
+
|
|
401
|
+
**死锁检测**:
|
|
402
|
+
```sql
|
|
403
|
+
-- 查看死锁信息
|
|
404
|
+
SHOW ENGINE INNODB STATUS;
|
|
405
|
+
|
|
406
|
+
-- 查看锁等待
|
|
407
|
+
SELECT
|
|
408
|
+
r.trx_id waiting_trx_id,
|
|
409
|
+
r.trx_mysql_thread_id waiting_thread,
|
|
410
|
+
b.trx_id blocking_trx_id,
|
|
411
|
+
b.trx_mysql_thread_id blocking_thread
|
|
412
|
+
FROM information_schema.INNODB_LOCK_WAITS w
|
|
413
|
+
JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id
|
|
414
|
+
JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id;
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**避免死锁建议**:
|
|
418
|
+
1. 按相同顺序访问表
|
|
419
|
+
2. 避免长事务
|
|
420
|
+
3. 使用较低的隔离级别
|
|
421
|
+
4. 合理设计索引
|
|
422
|
+
|
|
423
|
+
#### 6.4 分布式事务
|
|
424
|
+
|
|
425
|
+
**XA 事务**:
|
|
426
|
+
```sql
|
|
427
|
+
-- 启用 XA 事务
|
|
428
|
+
XA START 'xid1';
|
|
429
|
+
INSERT INTO orders VALUES (1, 'order1');
|
|
430
|
+
XA END 'xid1';
|
|
431
|
+
XA PREPARE 'xid1';
|
|
432
|
+
XA COMMIT 'xid1';
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
### 7. 主从复制
|
|
438
|
+
|
|
439
|
+
#### 7.1 主从架构
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
主库(Master)
|
|
443
|
+
↓ 二进制日志
|
|
444
|
+
从库(Slave1) 从库(Slave2) 从库(Slave3)
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
#### 7.2 主库配置
|
|
448
|
+
|
|
449
|
+
```ini
|
|
450
|
+
# my.cnf
|
|
451
|
+
[mysqld]
|
|
452
|
+
server-id = 1
|
|
453
|
+
log-bin = mysql-bin
|
|
454
|
+
binlog-format = ROW
|
|
455
|
+
binlog-do-db = mydb
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
**创建复制用户**:
|
|
459
|
+
```sql
|
|
460
|
+
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
|
|
461
|
+
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
|
|
462
|
+
FLUSH PRIVILEGES;
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
#### 7.3 从库配置
|
|
466
|
+
|
|
467
|
+
```ini
|
|
468
|
+
# my.cnf
|
|
469
|
+
[mysqld]
|
|
470
|
+
server-id = 2
|
|
471
|
+
relay-log = mysql-relay-bin
|
|
472
|
+
read-only = 1
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**配置复制**:
|
|
476
|
+
```sql
|
|
477
|
+
CHANGE MASTER TO
|
|
478
|
+
MASTER_HOST='master_ip',
|
|
479
|
+
MASTER_USER='repl',
|
|
480
|
+
MASTER_PASSWORD='password',
|
|
481
|
+
MASTER_LOG_FILE='mysql-bin.000001',
|
|
482
|
+
MASTER_LOG_POS=154;
|
|
483
|
+
|
|
484
|
+
START SLAVE;
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
#### 7.4 读写分离
|
|
488
|
+
|
|
489
|
+
**应用层配置**:
|
|
490
|
+
```java
|
|
491
|
+
// Spring Boot 配置
|
|
492
|
+
@Configuration
|
|
493
|
+
public class DataSourceConfig {
|
|
494
|
+
|
|
495
|
+
@Bean
|
|
496
|
+
@Primary
|
|
497
|
+
public DataSource masterDataSource() {
|
|
498
|
+
return DataSourceBuilder.create()
|
|
499
|
+
.url("jdbc:mysql://master:3306/mydb")
|
|
500
|
+
.build();
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
@Bean
|
|
504
|
+
public DataSource slaveDataSource() {
|
|
505
|
+
return DataSourceBuilder.create()
|
|
506
|
+
.url("jdbc:mysql://slave:3306/mydb")
|
|
507
|
+
.build();
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
@Bean
|
|
511
|
+
public RoutingDataSource routingDataSource() {
|
|
512
|
+
Map<Object, Object> targetDataSources = new HashMap<>();
|
|
513
|
+
targetDataSources.put("master", masterDataSource());
|
|
514
|
+
targetDataSources.put("slave", slaveDataSource());
|
|
515
|
+
|
|
516
|
+
RoutingDataSource routingDataSource = new RoutingDataSource();
|
|
517
|
+
routingDataSource.setTargetDataSources(targetDataSources);
|
|
518
|
+
routingDataSource.setDefaultTargetDataSource(masterDataSource());
|
|
519
|
+
return routingDataSource;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
#### 7.5 复制状态监控
|
|
525
|
+
|
|
526
|
+
```sql
|
|
527
|
+
-- 查看主库状态
|
|
528
|
+
SHOW MASTER STATUS;
|
|
529
|
+
|
|
530
|
+
-- 查看从库状态
|
|
531
|
+
SHOW SLAVE STATUS\G;
|
|
532
|
+
|
|
533
|
+
-- 关键指标
|
|
534
|
+
-- Slave_IO_Running: Yes
|
|
535
|
+
-- Slave_SQL_Running: Yes
|
|
536
|
+
-- Seconds_Behind_Master: 0
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
### 8. 备份与恢复
|
|
542
|
+
|
|
543
|
+
#### 8.1 逻辑备份
|
|
544
|
+
|
|
545
|
+
**mysqldump 备份**:
|
|
546
|
+
```bash
|
|
547
|
+
# 备份单个数据库
|
|
548
|
+
mysqldump -u root -p mydb > mydb_backup.sql
|
|
549
|
+
|
|
550
|
+
# 备份多个数据库
|
|
551
|
+
mysqldump -u root -p --databases db1 db2 > multi_db_backup.sql
|
|
552
|
+
|
|
553
|
+
# 备份所有数据库
|
|
554
|
+
mysqldump -u root -p --all-databases > all_db_backup.sql
|
|
555
|
+
|
|
556
|
+
# 只备份表结构
|
|
557
|
+
mysqldump -u root -p --no-data mydb > schema.sql
|
|
558
|
+
|
|
559
|
+
# 只备份数据
|
|
560
|
+
mysqldump -u root -p --no-create-info mydb > data.sql
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**逻辑恢复**:
|
|
564
|
+
```bash
|
|
565
|
+
# 恢复数据库
|
|
566
|
+
mysql -u root -p mydb < mydb_backup.sql
|
|
567
|
+
|
|
568
|
+
# 恢复时忽略错误
|
|
569
|
+
mysql -u root -p -f mydb < mydb_backup.sql
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
#### 8.2 物理备份
|
|
573
|
+
|
|
574
|
+
**Percona XtraBackup**:
|
|
575
|
+
```bash
|
|
576
|
+
# 全量备份
|
|
577
|
+
xtrabackup --backup --target-dir=/backup/full
|
|
578
|
+
|
|
579
|
+
# 增量备份
|
|
580
|
+
xtrabackup --backup --target-dir=/backup/inc1 \
|
|
581
|
+
--incremental-basedir=/backup/full
|
|
582
|
+
|
|
583
|
+
# 准备恢复
|
|
584
|
+
xtrabackup --prepare --target-dir=/backup/full
|
|
585
|
+
|
|
586
|
+
# 恢复数据
|
|
587
|
+
xtrabackup --copy-back --target-dir=/backup/full
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
#### 8.3 备份策略
|
|
591
|
+
|
|
592
|
+
| 策略 | 说明 | 适用场景 |
|
|
593
|
+
|------|------|---------|
|
|
594
|
+
| 全量备份 | 完整备份所有数据 | 每周一次 |
|
|
595
|
+
| 增量备份 | 只备份变化数据 | 每天一次 |
|
|
596
|
+
| 二进制日志备份 | 备份操作日志 | 实时备份 |
|
|
597
|
+
| 混合备份 | 全量+增量+日志 | 生产环境推荐 |
|
|
598
|
+
|
|
599
|
+
#### 8.4 时间点恢复
|
|
600
|
+
|
|
601
|
+
```bash
|
|
602
|
+
# 1. 恢复全量备份
|
|
603
|
+
mysql -u root -p < full_backup.sql
|
|
604
|
+
|
|
605
|
+
# 2. 应用二进制日志
|
|
606
|
+
mysqlbinlog --start-datetime="2024-01-01 00:00:00" \
|
|
607
|
+
--stop-datetime="2024-01-01 12:00:00" \
|
|
608
|
+
mysql-bin.000001 | mysql -u root -p
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
#### 8.5 自动备份脚本
|
|
612
|
+
|
|
613
|
+
```bash
|
|
614
|
+
#!/bin/bash
|
|
615
|
+
# MySQL 自动备份脚本
|
|
616
|
+
|
|
617
|
+
BACKUP_DIR="/backup/mysql"
|
|
618
|
+
DATE=$(date +%Y%m%d_%H%M%S)
|
|
619
|
+
DB_NAME="mydb"
|
|
620
|
+
DB_USER="backup"
|
|
621
|
+
DB_PASS="password"
|
|
622
|
+
|
|
623
|
+
# 创建备份目录
|
|
624
|
+
mkdir -p $BACKUP_DIR
|
|
625
|
+
|
|
626
|
+
# 执行备份
|
|
627
|
+
mysqldump -u$DB_USER -p$DB_PASS --single-transaction \
|
|
628
|
+
--routines --triggers --events $DB_NAME \
|
|
629
|
+
| gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
|
|
630
|
+
|
|
631
|
+
# 删除7天前的备份
|
|
632
|
+
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
|
|
633
|
+
|
|
634
|
+
# 记录日志
|
|
635
|
+
echo "Backup completed: ${DB_NAME}_${DATE}.sql.gz" >> $BACKUP_DIR/backup.log
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
### 9. 分区表
|
|
641
|
+
|
|
642
|
+
#### 9.1 分区类型
|
|
643
|
+
|
|
644
|
+
| 类型 | 说明 | 适用场景 |
|
|
645
|
+
|------|------|---------|
|
|
646
|
+
| RANGE | 范围分区 | 日期范围、数值范围 |
|
|
647
|
+
| LIST | 列表分区 | 离散值、地区分类 |
|
|
648
|
+
| HASH | 哈希分区 | 均匀分布数据 |
|
|
649
|
+
| KEY | 键分区 | 类似HASH,支持多列 |
|
|
650
|
+
|
|
651
|
+
#### 9.2 分区表示例
|
|
652
|
+
|
|
653
|
+
**RANGE 分区**:
|
|
654
|
+
```sql
|
|
655
|
+
CREATE TABLE orders (
|
|
656
|
+
id BIGINT,
|
|
657
|
+
order_date DATE,
|
|
658
|
+
customer_id INT,
|
|
659
|
+
amount DECIMAL(10,2),
|
|
660
|
+
PRIMARY KEY (id, order_date)
|
|
661
|
+
) PARTITION BY RANGE (YEAR(order_date)) (
|
|
662
|
+
PARTITION p2022 VALUES LESS THAN (2023),
|
|
663
|
+
PARTITION p2023 VALUES LESS THAN (2024),
|
|
664
|
+
PARTITION p2024 VALUES LESS THAN (2025),
|
|
665
|
+
PARTITION pmax VALUES LESS THAN MAXVALUE
|
|
666
|
+
);
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
**LIST 分区**:
|
|
670
|
+
```sql
|
|
671
|
+
CREATE TABLE customers (
|
|
672
|
+
id INT,
|
|
673
|
+
name VARCHAR(100),
|
|
674
|
+
region VARCHAR(50),
|
|
675
|
+
PRIMARY KEY (id, region)
|
|
676
|
+
) PARTITION BY LIST (region) (
|
|
677
|
+
PARTITION p_north VALUES IN ('北京', '天津', '河北'),
|
|
678
|
+
PARTITION p_south VALUES IN ('广东', '广西', '海南'),
|
|
679
|
+
PARTITION p_east VALUES IN ('上海', '江苏', '浙江'),
|
|
680
|
+
PARTITION p_west VALUES IN ('四川', '重庆', '云南')
|
|
681
|
+
);
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
**HASH 分区**:
|
|
685
|
+
```sql
|
|
686
|
+
CREATE TABLE logs (
|
|
687
|
+
id BIGINT AUTO_INCREMENT,
|
|
688
|
+
user_id INT,
|
|
689
|
+
action VARCHAR(50),
|
|
690
|
+
created_at DATETIME,
|
|
691
|
+
PRIMARY KEY (id)
|
|
692
|
+
) PARTITION BY HASH(user_id) PARTITIONS 10;
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
#### 9.3 分区管理
|
|
696
|
+
|
|
697
|
+
```sql
|
|
698
|
+
-- 添加分区
|
|
699
|
+
ALTER TABLE orders ADD PARTITION (
|
|
700
|
+
PARTITION p2025 VALUES LESS THAN (2026)
|
|
701
|
+
);
|
|
702
|
+
|
|
703
|
+
-- 删除分区(数据也会删除)
|
|
704
|
+
ALTER TABLE orders DROP PARTITION p2022;
|
|
705
|
+
|
|
706
|
+
-- 合并分区
|
|
707
|
+
ALTER TABLE orders REORGANIZE PARTITION p2023, p2024 INTO (
|
|
708
|
+
PARTITION p2023_2024 VALUES LESS THAN (2025)
|
|
709
|
+
);
|
|
710
|
+
|
|
711
|
+
-- 查看分区信息
|
|
712
|
+
SELECT * FROM information_schema.PARTITIONS
|
|
713
|
+
WHERE TABLE_NAME = 'orders';
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
---
|
|
717
|
+
|
|
718
|
+
## 使用示例
|
|
719
|
+
|
|
720
|
+
### 示例 1: 查询优化
|
|
721
|
+
|
|
722
|
+
```
|
|
723
|
+
用户: 这个查询很慢,怎么优化?
|
|
724
|
+
SELECT * FROM orders WHERE YEAR(create_time) = 2024 AND status = 'pending'
|
|
725
|
+
|
|
726
|
+
专家: 问题分析:
|
|
727
|
+
1. YEAR()函数导致索引失效
|
|
728
|
+
2. SELECT * 返回不必要字段
|
|
729
|
+
|
|
730
|
+
优化方案:
|
|
731
|
+
SELECT id, customer_id, total_amount, status
|
|
732
|
+
FROM orders
|
|
733
|
+
WHERE create_time >= '2024-01-01'
|
|
734
|
+
AND create_time < '2025-01-01'
|
|
735
|
+
AND status = 'pending';
|
|
736
|
+
|
|
737
|
+
建议添加索引:
|
|
738
|
+
CREATE INDEX idx_status_create ON orders(status, create_time);
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
### 示例 2: 索引设计
|
|
742
|
+
|
|
743
|
+
```
|
|
744
|
+
用户: 这个表需要什么索引?
|
|
745
|
+
CREATE TABLE orders (
|
|
746
|
+
id BIGINT PRIMARY KEY,
|
|
747
|
+
customer_id BIGINT,
|
|
748
|
+
status VARCHAR(20),
|
|
749
|
+
create_time DATETIME,
|
|
750
|
+
total_amount DECIMAL(10,2)
|
|
751
|
+
);
|
|
752
|
+
|
|
753
|
+
专家: 建议索引:
|
|
754
|
+
|
|
755
|
+
1. 客户查询索引:
|
|
756
|
+
CREATE INDEX idx_customer ON orders(customer_id);
|
|
757
|
+
|
|
758
|
+
2. 状态+时间组合索引(覆盖常见查询):
|
|
759
|
+
CREATE INDEX idx_status_create ON orders(status, create_time);
|
|
760
|
+
|
|
761
|
+
3. 金额范围查询索引:
|
|
762
|
+
CREATE INDEX idx_amount ON orders(total_amount);
|
|
763
|
+
|
|
764
|
+
注意:根据实际查询模式调整索引顺序
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### 示例 3: 表结构优化
|
|
768
|
+
|
|
769
|
+
```
|
|
770
|
+
用户: 这个表设计合理吗?
|
|
771
|
+
CREATE TABLE user_orders (
|
|
772
|
+
id INT,
|
|
773
|
+
user_id INT,
|
|
774
|
+
user_name VARCHAR(50),
|
|
775
|
+
user_phone VARCHAR(20),
|
|
776
|
+
order_no VARCHAR(50),
|
|
777
|
+
product_name VARCHAR(100),
|
|
778
|
+
product_price DECIMAL(10,2),
|
|
779
|
+
create_time DATETIME
|
|
780
|
+
);
|
|
781
|
+
|
|
782
|
+
专家: 存在以下问题:
|
|
783
|
+
|
|
784
|
+
1. 违反第二范式:user_name, user_phone 依赖 user_id
|
|
785
|
+
2. 违反第二范式:product_name, product_price 依赖 product_id
|
|
786
|
+
3. 缺少主键约束
|
|
787
|
+
4. 缺少外键约束
|
|
788
|
+
|
|
789
|
+
优化方案:
|
|
790
|
+
-- 用户表
|
|
791
|
+
CREATE TABLE users (
|
|
792
|
+
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
793
|
+
name VARCHAR(50),
|
|
794
|
+
phone VARCHAR(20)
|
|
795
|
+
);
|
|
796
|
+
|
|
797
|
+
-- 产品表
|
|
798
|
+
CREATE TABLE products (
|
|
799
|
+
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
800
|
+
name VARCHAR(100),
|
|
801
|
+
price DECIMAL(10,2)
|
|
802
|
+
);
|
|
803
|
+
|
|
804
|
+
-- 订单表
|
|
805
|
+
CREATE TABLE orders (
|
|
806
|
+
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
807
|
+
user_id INT,
|
|
808
|
+
product_id INT,
|
|
809
|
+
order_no VARCHAR(50) UNIQUE,
|
|
810
|
+
create_time DATETIME,
|
|
811
|
+
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
812
|
+
FOREIGN KEY (product_id) REFERENCES products(id)
|
|
813
|
+
);
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
---
|
|
817
|
+
|
|
818
|
+
## Guardrails
|
|
819
|
+
|
|
820
|
+
- 必须基于 MySQL 官方文档提供建议
|
|
821
|
+
- 优化方案需考虑版本兼容性
|
|
822
|
+
- 提供的 SQL 需经过语法验证
|
|
823
|
+
- 大表操作需提供分批处理建议
|
|
824
|
+
- 不确定的问题需明确说明
|
|
825
|
+
|
|
826
|
+
---
|
|
827
|
+
|
|
828
|
+
## 相关资源
|
|
829
|
+
|
|
830
|
+
- **MySQL 8.0 文档**: https://dev.mysql.com/doc/refman/8.0/en/
|
|
831
|
+
- **MySQL 9.4 文档**: https://dev.mysql.com/doc/refman/9.4/en/
|
|
832
|
+
- **Context7 Library ID**: `/websites/dev_mysql_doc_refman_8_0_en`
|