昨天晚上散步,顺便把宛平城里街两边的店拍了照,发到了小红书上,算是立此存照,号称的博物馆之城,沿街大部分都是饭店,名字叫博物馆的只有文房四宝博物馆和中医药博物馆,之前的奇石好像都没有找到。
尽管我对这个新的计划依然不看好,但如果有机会,我倒是可以拿林一苇放到我这里的一箱子战斗机邮票做个博物馆,再搞上一屋子3D打印机,作个战斗机打印农场。再弄一些无刷电机,做做垂直涵道发动机。
可惜,不想搞事情了,如果能维持生活,现在的主要目标是收缩,精力有限。
昨天晚上散步,顺便把宛平城里街两边的店拍了照,发到了小红书上,算是立此存照,号称的博物馆之城,沿街大部分都是饭店,名字叫博物馆的只有文房四宝博物馆和中医药博物馆,之前的奇石好像都没有找到。
尽管我对这个新的计划依然不看好,但如果有机会,我倒是可以拿林一苇放到我这里的一箱子战斗机邮票做个博物馆,再搞上一屋子3D打印机,作个战斗机打印农场。再弄一些无刷电机,做做垂直涵道发动机。
可惜,不想搞事情了,如果能维持生活,现在的主要目标是收缩,精力有限。
这一直是一个潜在的隐患,微信小程序不止小程序,就连放个正文也容易被识别成小说啥的,需要提供互联网出版资质,当然,这不是腾讯自己的问题,但作为一个平台,没有解决好这些问题,还是可以指责的,何况小程序每年还要收300元的巨额认证费。
而对于一个独立数字出版人来说,尽管有自己的公司,但几乎任何资质都不可能办理下来,也不太可能在搞好自己的技术研发的同时,去兼顾这么多额外的事务。
于是,我只好决定把微信小程序蜷缩为一个搜索入口,其他功能都迁移到H5中。如此一来,也就不再纠结那些在微信小程序因为兼容问题不好做的功能,可以在H5里面堂堂正正做人。
首先看是什么病?如果用默沙东诊疗手册都可以自己判断个差不多的,想必就不用去挂专家号了,去医院主要是为了用检查手段,再让医生确认下。
其实很多医院的专家号和普通号是一波医生在出诊,给医生轮流出专家号是为了提高诊费收入,让医生轮流出普通号是为了照顾普通患者,其实接诊普通号的大夫并不差,改天他/她就去出专家号了。
如果不是特别特殊的病,完全不必去挂专家号,除非你确信只有这个专家才能看,这样的情况并不多,反而是很多有钱有闲的人,一个不要紧的病,把圈子里的专家看一遍,还要去河南去看某个神医,这才是真正的医疗资源浪费。
网上找一下M209的驱动安装包,貌似官网已经搜不到了,这是老产品,我是从太平洋下载的,压缩包里面是个iso文件,另外安装了一个virtual clone drive来解压这个iso。
驱动安装以后,系统菜单中的路径有可能是错误的,可以直接去c盘下面找一下安装目录,确认下路径,并把这个路径更新到快捷菜单中。
驱动包里是实际上有一个扫描软件PanelV2.0,只是这个官方的软件并不好用,连幅面都无法修改,默认是A3,跟机器一样。
所以,另外装了一个NAPS2,也是grok推荐给我的。安装的时候提示需要.net4.6.2,如有问题可以看上一篇博客。
在微软官网下载了4.6.2的离线安装包,安装时报错,这是因为win7上没有sha2验证,通过安装系统更新的方式有点麻烦了,于是问了下grok,它给出一个办法,绕过验证,于是,在点开离线安装包以后,c盘下就有了一个临时文件夹,把它复制一份,存到别的位置,在里面找到netfx_Full_x64.msi(64 位系统)或 netfx_Full_x86.msi(32 位系统),双击运行就行了。
1. 功能概述
Word Scramble 是剑桥词典 +Plus 平台上的一款在线单词游戏,玩家需要在限定时间内根据给定的单词定义,将一组打乱的字母重新排列组成正确的单词。该游戏旨在帮助英语学习者提升词汇和拼写能力,同时通过游戏化的方式增加趣味性。以下是主要功能:
2. 技术实现分析
基于网页游戏的特性,Word Scramble 可能采用了以下技术栈和实现方式:
(1) 前端技术
(2) 后端技术
(3) 数据管理与词库
function shuffleWord(word) { let letters = word.split(''); for (let i = letters.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [letters[i], letters[j]] = [letters[j], letters[i]]; // 交换字母 } return letters.join(''); }
该算法随机打乱单词的字母序列,确保每次游戏的字母顺序不同。(4) API 交互
(5) 多语言支持
(6) 用户账户与社区功能
(7) 性能优化
3. 用户体验设计
4. 可能的挑战与解决方案
5. 总结
Word Scramble 是一款结合教育与娱乐的在线游戏,通过现代 Web 技术(HTML/CSS/JavaScript、可能的框架如 React)、后端 CMS 和数据库、以及 API 驱动的内容更新实现。其多语言支持、响应式设计和用户账户功能增强了全球用户的使用体验。游戏通过每日更新的单词和定义、计时挑战以及交互反馈,成功吸引英语学习者反复参与,同时通过词汇表功能与剑桥词典 +Plus 平台深度整合。
参考资料:
基于 Vue3 的 monorepo 架构设计一个数字阅读前端项目,需要清晰的模块划分和合理的目录结构,以支持图书搜索、用户登录、用户中心、数字图书模板以及特色应用场景(如汉字笔画练习、中英文字词听写、普通话语音测评等)。以下是一个详细的项目结构设计,采用 monorepo 方式,使用 apps、packages 和 shared-components 文件夹来组织子模块,同时考虑 Vue3 的组件化开发和复用性。
项目设计目标
技术栈
项目结构
以下是项目的目录结构,分为 apps(应用入口)、packages(工具库和业务逻辑)、shared-components(通用组件)三大模块,并包含配置文件和文档。
digital-reading-project/
├── apps/
│ ├── book-search/ # 图书搜索应用
│ │ ├── src/
│ │ │ ├── components/ # 搜索相关组件
│ │ │ ├── views/ # 页面视图
│ │ │ ├── router/ # 路由配置
│ │ │ ├── store/ # Pinia 状态管理
│ │ │ ├── assets/ # 静态资源
│ │ │ ├── App.vue # 应用根组件
│ │ │ └── main.ts # 入口文件
│ │ ├── vite.config.ts # Vite 配置文件
│ │ ├── package.json # 应用依赖
│ │ └── tsconfig.json # TypeScript 配置
│ ├── user-center/ # 用户中心应用(登录、个人资料等)
│ │ ├── src/
│ │ │ ├── components/ # 用户中心相关组件
│ │ │ ├── views/ # 页面视图(如个人资料、设置)
│ │ │ ├── router/
│ │ │ ├── store/
│ │ │ ├── assets/
│ │ │ ├── App.vue
│ │ │ └── main.ts
│ │ ├── vite.config.ts
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── digital-books/ # 数字图书模板应用
│ │ ├── src/
│ │ │ ├── templates/ # 多种图书模板
│ │ │ │ ├── novel/ # 小说阅读模板
│ │ │ │ ├── textbook/ # 教材阅读模板
│ │ │ │ └── comic/ # 漫画阅读模板
│ │ │ ├── components/
│ │ │ ├── views/
│ │ │ ├── router/
│ │ │ ├── store/
│ │ │ ├── assets/
│ │ │ ├── App.vue
│ │ │ └── main.ts
│ │ ├── vite.config.ts
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── special-scenes/ # 特色应用场景
│ │ ├── src/
│ │ │ ├── scenes/
│ │ │ │ ├── hanzi-practice/ # 汉字笔画练习
│ │ │ │ ├── dictation/ # 中英文字词听写
│ │ │ │ └── mandarin-test/ # 普通话语音测评
│ │ │ ├── components/
│ │ │ ├── views/
│ │ │ ├── router/
│ │ │ ├── store/
│ │ │ ├── assets/
│ │ │ ├── App.vue
│ │ │ └── main.ts
│ │ ├── vite.config.ts
│ │ ├── package.json
│ │ └── tsconfig.json
├── packages/
│ ├── api-client/ # API 请求封装
│ │ ├── src/
│ │ │ ├── index.ts # 导出 API 方法
│ │ │ ├── book.ts # 图书相关 API
│ │ │ ├── user.ts # 用户相关 API
│ │ │ └── special.ts # 特色场景 API
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── utils/ # 通用工具函数
│ │ ├── src/
│ │ │ ├── index.ts # 导出工具函数
│ │ │ ├── format.ts # 格式化工具(如时间、文本)
│ │ │ ├── storage.ts # 本地存储封装
│ │ │ └── audio.ts # 音频处理工具(如语音测评)
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── types/ # TypeScript 类型定义
│ │ ├── src/
│ │ │ ├── index.ts # 导出类型
│ │ │ ├── book.ts # 图书相关类型
│ │ │ ├── user.ts # 用户相关类型
│ │ │ └── scene.ts # 特色场景类型
│ │ ├── package.json
│ │ └── tsconfig.json
├── shared-components/ # 通用组件
│ ├── src/
│ │ ├── index.ts # 导出所有组件
│ │ ├── Button.vue # 通用按钮
│ │ ├── Input.vue # 通用输入框
│ │ ├── Modal.vue # 通用模态框
│ │ ├── Reader.vue # 通用阅读器组件
│ │ ├── AudioPlayer.vue # 音频播放器
│ │ └── StrokeCanvas.vue # 汉字笔画画布
│ ├── package.json
│ ├── vite.config.ts
│ └── tsconfig.json
├── scripts/ # 构建和部署脚本
│ ├── build-all.ts # 构建所有应用的脚本
│ └── deploy.ts # 部署脚本
├── docs/ # 项目文档
│ ├── README.md # 项目说明
│ └── architecture.md # 架构说明
├── .eslintrc.js # ESLint 配置
├── .prettierrc # Prettier 配置
├── pnpm-workspace.yaml # pnpm monorepo 配置文件
├── tsconfig.json # 全局 TypeScript 配置
├── vite.config.ts # 全局 Vite 配置(可选)
└── package.json # 根目录依赖
目录结构说明
1. apps 目录
apps 包含独立的应用入口,每个应用是一个完整的 Vue3 项目,使用 Vite 构建,共享 packages 和 shared-components 的内容。
2. packages 目录
packages 包含可复用的工具库和业务逻辑模块,供多个 apps 使用。
3. shared-components 目录
shared-components 包含通用 Vue 组件,支持跨应用复用。
4. 根目录配置
packages: - 'apps/*' - 'packages/*' - 'shared-components'
定义 monorepo 的 workspace,允许 apps 和 packages 互相引用。实现细节
1. Monorepo 管理
{ "scripts": { "dev:search": "pnpm --filter book-search dev", "dev:user": "pnpm --filter user-center dev", "build": "pnpm -r build", "test": "pnpm -r test" } }
2. 组件复用
// shared-components/src/index.ts export { default as Button } from './Button.vue'; export { default as Reader } from './Reader.vue';
import { Button } from '@shared';
3. API 封装
// packages/api-client/src/book.ts import axios from 'axios'; import type { Book } from '@types'; export async function searchBooks(query: string): Promise<Book[]> { const response = await axios.get('/api/books', { params: { query } }); return response.data; }
4. 特色场景实现
5. 路由和状态管理
// apps/book-search/src/router/index.ts import { createRouter, createWebHistory } from 'vue-router'; import SearchView from '../views/SearchView.vue'; const router = createRouter({ history: createWebHistory(), routes: [ { path: '/search', component: SearchView }, { path: '/category', component: () => import('../views/CategoryView.vue') }, ], }); export default router;
6. 测试
import { mount } from '@vue/test-utils'; import Button from '@shared/Button.vue'; describe('Button', () => { it('renders correctly', () => { const wrapper = mount(Button, { props: { label: 'Click Me' } }); expect(wrapper.text()).toContain('Click Me'); }); });
开发流程
可扩展性考虑
总结
这个 monorepo 架构将数字阅读项目的功能模块化,清晰划分了 apps(应用入口)、packages(工具库)和 shared-components(通用组件)。通过 pnpm 和 Vite 管理依赖和构建,结合 Vue3 和 TypeScript 实现高效开发。每个子模块(图书搜索、用户中心、数字图书、特色场景)独立维护,同时复用通用代码,确保项目可扩展和易维护。
一个基于 Markdown 的电子书方案,类似 EPUB 标准并原生支持 Mermaid 和 Markmap 等可视化和交互功能,解决 Markdown 的轻量特性与电子书格式的结构化需求之间的平衡,同时确保对 Mermaid(流程图、时序图等)和 Markmap(思维导图)等工具的原生支持。以下是一个详细的设计方案,涵盖架构、实现方法、可视化支持和交互功能。
1. 设计目标
2. 方案架构
基于 Markdown 的电子书格式(暂称为 MDEpub,Markdown-based ePub)可以分为以下核心组件:
2.1 文件结构
类似 EPUB,MDEpub 使用文件夹结构组织内容:
mdepub-book/
├── meta.yaml # 元数据(标题、作者、语言等)
├── toc.md # 目录(类似 EPUB 的 NCX)
├── content/ # 内容文件夹
│ ├── chapter1.md # 章节 1(Markdown 文件)
│ ├── chapter2.md # 章节 2
│ └── assets/ # 静态资源(图片、CSS、JS 等)
├── styles.css # 全局样式
└── config.json # 构建配置(例如 Mermaid/Markmap 渲染设置)
title: 示例电子书 author: 作者姓名 language: zh-CN publisher: 出版社 date: 2025-05-28
# 目录 - [第一章](content/chapter1.md) - [第二章](content/chapter2.md) - [子章节](content/chapter2.md#section1)
2.2 Markdown 扩展
为支持 Mermaid 和 Markmap,扩展 Markdown 语法,允许在代码块中指定渲染参数。例如:
markdown
# 第一章
## 流程图
```mermaid {theme: "dark", format: "svg"}
graph TD
A[开始] --> B{判断}
B -->|是| C[执行]
B -->|否| D[结束]
思维导图
markmap {height: “300px”, zoom: true}
# 思维导图
## 分支1
### 子节点1
## 分支2
- 使用 `{}` 指定渲染参数(如主题、高度、交互性)。
- 支持标准 Markdown 语法,同时兼容 Mermaid 和 Markmap 的特定代码块。
#### **2.3 输出格式**
MDEpub 的最终输出是一个压缩包(类似 EPUB 的 ZIP 格式),包含:
- **HTML 文件**:每个 Markdown 章节转换为独立的 HTML 文件,嵌入 Mermaid 和 Markmap 的渲染结果(SVG 或交互式 JS)。
- **元数据文件**:基于 `meta.yaml` 生成的 XML 或 JSON。
- **目录文件**:基于 `toc.md` 生成的导航文件(类似 NCX 或 HTML TOC)。
- **资源文件**:CSS、JS、图片等,包含 Mermaid 和 Markmap 的运行时库。
- **容器文件**:定义文件结构的元文件,类似 EPUB 的 `mimetype` 和 `META-INF/container.xml`。
---
### 3. **实现方法**
以下是实现 MDEpub 的核心步骤和技术选型:
#### **3.1 解析 Markdown**
- **工具**:使用 [marked](https://marked.js.org/) 或 [markdown-it](https://github.com/markdown-it/markdown-it) 解析 Markdown 文件,转换为 HTML。
- **扩展插件**:
- **Mermaid**:集成 `@mermaid-js/mermaid` 解析代码块,渲染为 SVG 或交互式 HTML。
- **Markmap**:集成 `markmap-lib` 和 `markmap-view`,将 Markmap 代码块渲染为 SVG 或交互式思维导图。
- **自定义代码块**:扩展 Markdown 解析器,识别 `mermaid` 和 `markmap` 代码块,并调用对应渲染器。
#### **3.2 渲染可视化内容**
- **Mermaid**:
- 使用 Mermaid CLI 或 `@mermaid-js/mermaid` 将代码块渲染为 SVG(静态)或嵌入 JS 代码(交互式)。
- 示例(Node.js 环境):
```javascript
import mermaid from 'mermaid';
mermaid.initialize({ theme: 'dark' });
const svg = await mermaid.render('graph', 'graph TD A-->B');
```
- 将 SVG 嵌入 HTML,或包含 Mermaid JS 库以支持交互(例如点击放大)。
- **Markmap**:
- 使用 `markmap-lib` 解析 Markmap 代码,生成 SVG 或 HTML+JS。
- 示例:
```javascript
import { Markmap } from 'markmap-view';
const mm = Markmap.create(svgElement, { height: 300, zoom: true });
mm.setData(markmapData);
```
- 支持交互功能(如缩放、展开/折叠节点)。
- **嵌入方式**:
- **静态**:将 SVG 直接嵌入 HTML,适合离线阅读器。
- **动态**:嵌入 Mermaid/Markmap 的 JS 运行时,生成交互式图表,适合 Web 浏览器或支持 JS 的阅读器。
#### **3.3 生成电子书**
- **构建工具**:开发一个 CLI 工具(例如 `mdepub-cli`),基于 Node.js,执行以下步骤:
1. 读取 `meta.yaml` 和 `toc.md`,生成元数据和导航。
2. 解析 `content/` 下的 Markdown 文件,转换为 HTML。
3. 处理 Mermaid 和 Markmap 代码块,渲染为 SVG 或交互式 HTML。
4. 合并 CSS 和 JS 资源,生成最终文件结构。
5. 打包为 ZIP 文件,添加 `mimetype`(例如 `application/mdepub+zip`)。
- **示例命令**:
```bash
mdepub build mdepub-book/ -o book.mdepub
3.4 阅读器支持
4. 支持 Mermaid 和 Markmap 的关键技术
4.1 Mermaid
4.2 Markmap
4.3 其他可视化工具
5. 优势与挑战
优势
挑战
6. 实现工具与工作流
6.1 开发工具
6.2 工作流
6.3 示例命令
bash
# 初始化项目
mdepub init my-book
# 构建 MDEpub
mdepub build my-book/ -o my-book.mdepub
# 预览(启动本地 Web 服务器)
mdepub preview my-book/
# 转换为标准 EPUB(静态)
mdepub export my-book/ -o my-book.epub --static
7. 与 EPUB 的对比
特性 | EPUB | MDEpub |
---|---|---|
输入格式 | XHTML, XML, CSS | Markdown |
Mermaid 支持 | 需外部转换 | 原生支持(SVG/JS) |
Markmap 支持 | 需外部转换 | 原生支持(SVG/JS) |
交互性 | 有限(需特定阅读器) | 强(支持 JS 的交互式图表) |
兼容性 | 广泛(标准阅读器) | 需专用阅读器或浏览器 |
文件大小 | 较小(静态内容) | 可能较大(含 JS 库) |
开发复杂性 | 高(XML 结构复杂) | 低(Markdown 简单) |
8. 未来扩展
9. 快速原型实现
以下是一个简单的 Node.js 脚本,展示如何将包含 Mermaid 和 Markmap 的 Markdown 转换为 MDEpub 核心组件:
javascript
const fs = require('fs');
const markdownIt = require('markdown-it')();
const mermaid = require('mermaid');
const { Markmap } = require('markmap-view');
const archiver = require('archiver');
// 初始化 Mermaid
mermaid.initialize({ startOnLoad: false });
// 自定义 Markdown 插件
markdownIt.use((md) => {
md.renderer.rules.fence_custom = {
mermaid: async (tokens, idx) => {
const code = tokens[idx].content;
const { svg } = await mermaid.render('graph', code);
return `<div class="mermaid">${svg}</div>`;
},
markmap: (tokens, idx) => {
const code = tokens[idx].content;
return `<div class="markmap" data-markmap="${encodeURIComponent(code)}"></div>`;
}
};
});
// 解析 Markdown 文件
const mdContent = fs.readFileSync('content/chapter1.md', 'utf-8');
const htmlContent = markdownIt.render(mdContent);
// 生成 HTML 文件
fs.writeFileSync('output/chapter1.html', `
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="styles.css">
<script src="mermaid.min.js"></script>
<script src="d3.min.js"></script>
<script src="markmap-view.min.js"></script>
</head>
<body>
${htmlContent}
<script>
// 初始化 Markmap
document.querySelectorAll('.markmap').forEach(el => {
const data = decodeURIComponent(el.dataset.markmap);
const mm = Markmap.create(el, { height: 300 });
mm.setData(data);
});
</script>
</body>
</html>
`);
// 打包为 MDEpub
const output = fs.createWriteStream('book.mdepub');
const archive = archiver('zip');
archive.pipe(output);
archive.directory('output/', false);
archive.finalize();
10. 总结
通过设计一个基于 Markdown 的电子书格式(MDEpub),可以实现类似 EPUB 的功能,同时原生支持 Mermaid 和 Markmap 的可视化和交互功能。核心是扩展 Markdown 解析器,集成 Mermaid 和 Markmap 渲染器,生成包含 SVG 或交互式 HTML 的电子书文件。MDEpub 结合 Markdown 的简洁性和可视化工具的强大功能,适合技术文档、教程和交互式电子书。下一步是开发 CLI 工具和专用阅读器,优化兼容性和性能。
有一个查询很慢,27s,查询了一下mysql的状态:
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
+-------------------------------------------+--------------------------------------------------+
| Variable_name | Value |
+-------------------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 241109 21:58:30 |
| Innodb_buffer_pool_resize_status | |
| Innodb_buffer_pool_resize_status_code | 0 |
| Innodb_buffer_pool_resize_status_progress | 0 |
| Innodb_buffer_pool_pages_data | 7168 |
| Innodb_buffer_pool_bytes_data | 117440512 |
| Innodb_buffer_pool_pages_dirty | 5 |
| Innodb_buffer_pool_bytes_dirty | 81920 |
| Innodb_buffer_pool_pages_flushed | 152905174 |
| Innodb_buffer_pool_pages_free | 1007 |
| Innodb_buffer_pool_pages_misc | 17 |
| Innodb_buffer_pool_pages_total | 8192 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 34590772215 |
| Innodb_buffer_pool_read_ahead_evicted | 46737241 |
| Innodb_buffer_pool_read_requests | 718733851921 |
| Innodb_buffer_pool_reads | 1798889354 |
| Innodb_buffer_pool_wait_free | 6345356 |
| Innodb_buffer_pool_write_requests | 506818935 |
+-------------------------------------------+--------------------------------------------------+
20 rows in set (0.26 sec)
问了下Grok,它说我的默认配置太低了,数据库服务器是16G内存,数据库占用的很少,大部分是被一个java程序占用了,查了一下原来是当时安装了并未使用的apache-dolphinscheduler,这个东西很占资源,于是干掉。再改以下配置:
innodb_buffer_pool_size = 8G
innodb_buffer_pool_instances = 4
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_load_at_startup = 1
重启mysql以后:
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
+-------------------------------------------+--------------------------------------------------+
| Variable_name | Value |
+-------------------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 250528 22:42:35 |
| Innodb_buffer_pool_resize_status | |
| Innodb_buffer_pool_resize_status_code | 0 |
| Innodb_buffer_pool_resize_status_progress | 0 |
| Innodb_buffer_pool_pages_data | 231482 |
| Innodb_buffer_pool_bytes_data | 3792601088 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 1455 |
| Innodb_buffer_pool_pages_free | 292740 |
| Innodb_buffer_pool_pages_misc | 66 |
| Innodb_buffer_pool_pages_total | 524288 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 226612 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 4875046 |
| Innodb_buffer_pool_reads | 4713 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 4724 |
+-------------------------------------------+--------------------------------------------------+
20 rows in set (0.00 sec)
不过查询依然很慢,分析了一下请求来自laravel的一个多态关联表,4000W+行数据,两个关键字段是able_type和able_id,于是给这两个字段做了一个联合索引,idx_able,索引创建花了8分钟,索引创建过程中可能有锁,避开访问高峰时操作,完成以后查询降到了300ms以内。
总结:
laravel的多态表可以给able_type和able_id建联合索引。