{
  "schemaVersion": "1.0",
  "item": {
    "slug": "mysql",
    "name": "MySQL",
    "source": "tencent",
    "type": "skill",
    "category": "数据分析",
    "sourceUrl": "https://clawhub.ai/ivangdavila/mysql",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/mysql",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/mysql",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=mysql",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "indexes.md",
      "production.md",
      "queries.md",
      "transactions.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/mysql"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/mysql",
    "agentPageUrl": "https://openagent3.xyz/skills/mysql/agent",
    "manifestUrl": "https://openagent3.xyz/skills/mysql/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/mysql/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Quick Reference",
        "body": "TopicFileIndex design deep diveindexes.mdTransactions and lockingtransactions.mdQuery optimizationqueries.mdProduction configproduction.md"
      },
      {
        "title": "Character Set Traps",
        "body": "utf8 is broken—only 3 bytes, can't store emoji; always use utf8mb4\nutf8mb4_unicode_ci for case-insensitive sorting; utf8mb4_bin for exact byte comparison\nCollation mismatch in JOINs kills performance—ensure consistent collation across tables\nConnection charset must match: SET NAMES utf8mb4 or connection string parameter\nIndex on utf8mb4 column larger—may hit index size limits; consider prefix index"
      },
      {
        "title": "Index Differences from PostgreSQL",
        "body": "No partial indexes—can't WHERE active = true in index definition\nNo expression indexes until MySQL 8.0.13—must use generated columns before that\nTEXT/BLOB needs prefix length: INDEX (description(100))—without length, error\nNo INCLUDE for covering—add columns to index itself: INDEX (a, b, c) to cover c\nForeign keys auto-indexed only in InnoDB—verify engine before assuming"
      },
      {
        "title": "UPSERT Patterns",
        "body": "INSERT ... ON DUPLICATE KEY UPDATE—not standard SQL; needs unique key conflict\nLAST_INSERT_ID() for auto-increment—no RETURNING clause like PostgreSQL\nREPLACE INTO deletes then inserts—changes auto-increment ID, triggers DELETE cascade\nCheck affected rows: 1 = inserted, 2 = updated (counter-intuitive)"
      },
      {
        "title": "Locking Traps",
        "body": "SELECT ... FOR UPDATE locks rows—but gap locks may lock more than expected\nInnoDB uses next-key locking—prevents phantom reads but can cause deadlocks\nLock wait timeout default 50s—innodb_lock_wait_timeout for adjustment\nFOR UPDATE SKIP LOCKED exists in MySQL 8+—queue pattern\nInnoDB default isolation is REPEATABLE READ, not READ COMMITTED like PostgreSQL\nDeadlocks are expected—code must catch and retry, not just fail"
      },
      {
        "title": "GROUP BY Strictness",
        "body": "sql_mode includes ONLY_FULL_GROUP_BY by default in MySQL 5.7+\nNon-aggregated columns must be in GROUP BY—unlike old MySQL permissive mode\nANY_VALUE(column) to silence error when you know values are same\nCheck sql_mode on legacy databases—may behave differently"
      },
      {
        "title": "InnoDB vs MyISAM",
        "body": "Always use InnoDB—transactions, row locking, foreign keys, crash recovery\nMyISAM still default for some system tables—don't use for application data\nCheck engine: SHOW TABLE STATUS—convert with ALTER TABLE ... ENGINE=InnoDB\nMixed engines in JOINs work but lose transaction guarantees"
      },
      {
        "title": "Query Quirks",
        "body": "LIMIT offset, count different order than PostgreSQL's LIMIT count OFFSET offset\n!= and <> both work; prefer <> for SQL standard\nNo transactional DDL—ALTER TABLE commits immediately, can't rollback\nBoolean is TINYINT(1)—TRUE/FALSE are just 1/0\nIFNULL(a, b) instead of COALESCE for two args—though COALESCE works"
      },
      {
        "title": "Connection Management",
        "body": "wait_timeout kills idle connections—default 8 hours; pooler may not notice\nmax_connections default 151—often too low; each uses memory\nConnection pools: don't exceed max_connections across all app instances\nSHOW PROCESSLIST to see active connections—kill long-running with KILL <id>"
      },
      {
        "title": "Replication Awareness",
        "body": "Statement-based replication can break with non-deterministic functions—UUID(), NOW()\nRow-based replication safer but more bandwidth—default in MySQL 8\nRead replicas have lag—check Seconds_Behind_Master before relying on replica reads\nDon't write to replica—usually read-only but verify"
      },
      {
        "title": "Performance",
        "body": "EXPLAIN ANALYZE only in MySQL 8.0.18+—older versions just EXPLAIN without actual times\nQuery cache removed in MySQL 8—don't rely on it; cache at application level\nOPTIMIZE TABLE for fragmented tables—locks table; use pt-online-schema-change for big tables\ninnodb_buffer_pool_size—set to 70-80% of RAM for dedicated DB server"
      }
    ],
    "body": "Quick Reference\nTopic\tFile\nIndex design deep dive\tindexes.md\nTransactions and locking\ttransactions.md\nQuery optimization\tqueries.md\nProduction config\tproduction.md\nCharacter Set Traps\nutf8 is broken—only 3 bytes, can't store emoji; always use utf8mb4\nutf8mb4_unicode_ci for case-insensitive sorting; utf8mb4_bin for exact byte comparison\nCollation mismatch in JOINs kills performance—ensure consistent collation across tables\nConnection charset must match: SET NAMES utf8mb4 or connection string parameter\nIndex on utf8mb4 column larger—may hit index size limits; consider prefix index\nIndex Differences from PostgreSQL\nNo partial indexes—can't WHERE active = true in index definition\nNo expression indexes until MySQL 8.0.13—must use generated columns before that\nTEXT/BLOB needs prefix length: INDEX (description(100))—without length, error\nNo INCLUDE for covering—add columns to index itself: INDEX (a, b, c) to cover c\nForeign keys auto-indexed only in InnoDB—verify engine before assuming\nUPSERT Patterns\nINSERT ... ON DUPLICATE KEY UPDATE—not standard SQL; needs unique key conflict\nLAST_INSERT_ID() for auto-increment—no RETURNING clause like PostgreSQL\nREPLACE INTO deletes then inserts—changes auto-increment ID, triggers DELETE cascade\nCheck affected rows: 1 = inserted, 2 = updated (counter-intuitive)\nLocking Traps\nSELECT ... FOR UPDATE locks rows—but gap locks may lock more than expected\nInnoDB uses next-key locking—prevents phantom reads but can cause deadlocks\nLock wait timeout default 50s—innodb_lock_wait_timeout for adjustment\nFOR UPDATE SKIP LOCKED exists in MySQL 8+—queue pattern\nInnoDB default isolation is REPEATABLE READ, not READ COMMITTED like PostgreSQL\nDeadlocks are expected—code must catch and retry, not just fail\nGROUP BY Strictness\nsql_mode includes ONLY_FULL_GROUP_BY by default in MySQL 5.7+\nNon-aggregated columns must be in GROUP BY—unlike old MySQL permissive mode\nANY_VALUE(column) to silence error when you know values are same\nCheck sql_mode on legacy databases—may behave differently\nInnoDB vs MyISAM\nAlways use InnoDB—transactions, row locking, foreign keys, crash recovery\nMyISAM still default for some system tables—don't use for application data\nCheck engine: SHOW TABLE STATUS—convert with ALTER TABLE ... ENGINE=InnoDB\nMixed engines in JOINs work but lose transaction guarantees\nQuery Quirks\nLIMIT offset, count different order than PostgreSQL's LIMIT count OFFSET offset\n!= and <> both work; prefer <> for SQL standard\nNo transactional DDL—ALTER TABLE commits immediately, can't rollback\nBoolean is TINYINT(1)—TRUE/FALSE are just 1/0\nIFNULL(a, b) instead of COALESCE for two args—though COALESCE works\nConnection Management\nwait_timeout kills idle connections—default 8 hours; pooler may not notice\nmax_connections default 151—often too low; each uses memory\nConnection pools: don't exceed max_connections across all app instances\nSHOW PROCESSLIST to see active connections—kill long-running with KILL <id>\nReplication Awareness\nStatement-based replication can break with non-deterministic functions—UUID(), NOW()\nRow-based replication safer but more bandwidth—default in MySQL 8\nRead replicas have lag—check Seconds_Behind_Master before relying on replica reads\nDon't write to replica—usually read-only but verify\nPerformance\nEXPLAIN ANALYZE only in MySQL 8.0.18+—older versions just EXPLAIN without actual times\nQuery cache removed in MySQL 8—don't rely on it; cache at application level\nOPTIMIZE TABLE for fragmented tables—locks table; use pt-online-schema-change for big tables\ninnodb_buffer_pool_size—set to 70-80% of RAM for dedicated DB server"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/mysql",
    "publisherUrl": "https://clawhub.ai/ivangdavila/mysql",
    "owner": "ivangdavila",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/mysql",
    "downloadUrl": "https://openagent3.xyz/downloads/mysql",
    "agentUrl": "https://openagent3.xyz/skills/mysql/agent",
    "manifestUrl": "https://openagent3.xyz/skills/mysql/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/mysql/agent.md"
  }
}