本文主要适用于从老版本升级上来的 Typecho,做一下数据库优化提高查表速度,顺便让 blog 支持一下 Emoji


数据表引擎

1.2 以上版本一律建议 InnoDB,新版本 InnoDB 查表效率比 MyISAM 强很多,在我的机器上,查表能快 10ms 左右
旧版本 InnoDB 反而会比 MyISAM 慢

InnoDB vs MyISAM

InnoDBMyISAM
支持事务处理等不支持事务处理等
不加锁读取
支持外键不支持外键
支持行锁不支持行锁
不支持FULLTEXT类型的索引支持FULLTEXT类型的索引
不保存表的具体行数,扫描表来计算有多少行保存表的具体行数,不带where时,直接返回保存的行数。
DELETE表时,是一行一行地删除DELETE表时,先drop表,然后重建表
InnoDB把数据和索引存放在表空间里面MyISAM表被存放在三个文件,frm文件存放表格定义
跨平台可直接拷贝使用跨平台很难直接拷贝。
InnoDB中必须包含AUTO_INCREMENT类型字段的索引表格很难被压缩MyISAM中可以使用AUTO_INCREMENT类型字段建立联合索引,表格可以被压缩。

转换方法

将 MyISAM 转换为 InnoDB 的方法:

可以使用下面的命令,或者使用 PHPMyAdmin 等工具

1
ALTER TABLE `blog_metas` ENGINE = InnoDB

blog_metas 替换为你 Typecho 的数据表,分别将每个数据表都转换为 InnoDB,转换完成后修改配置文件 config.inc.php,开启 InnoDB

1
2
3
4
5
6
7
8
9
10
11
12
//config db
$db = new \Typecho\Db('Pdo_Mysql', 'blog_');
$db->addServer(array (
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'MBRjun',
'password' => 'DATABASE PASSWORD',
'charset' => 'utf8mb4',
'database' => 'mbrjun',
'engine' => 'InnoDB',
), \Typecho\Db::READ | \Typecho\Db::WRITE);
\Typecho\Db::set($db);

将 engine 修改为 InnoDB

排序规则 & 字符集

老版本默认的字符集是 utf8,这个字符集是不支持 ?emoji 和部分生僻字的,建议修改为 utf8mb4,同时将排序规则修改为 utf8mb4_0900_ai_ci

修改字符集的命令:

1
ALTER TABLE blog_metas CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci

PHPMyAdmin: