我的应用程序是非常数据库密集型的。目前,我正在运行 MySQL 5.5.19 并使用 MyISAM,但我正在迁移到 InnoDB。剩下的唯一问题是校验和性能。
我的应用程序CHECKSUM TABLE在高峰时间每秒执行大约 500-1000 条语句,因为客户端 GUI 不断轮询数据库以进行更改(它是一个监控系统,因此必须非常敏感且快速)。
使用 MyISAM,可以在表修改时预先计算实时校验和,并且速度非常快。但是,InnoDB 中没有这样的东西。所以,CHECKSUM TABLE很慢。
我希望能够检查表的最后更新时间,不幸的是,这在 InnoDB 中也不可用。我现在卡住了,因为测试表明应用程序的性能急剧下降。
更新表的代码行太多了,因此在应用程序中实现逻辑来记录表更改是不可能的。
是否有任何快速方法来检测 InnoDB 表中的变化?
我们有一个应用程序,它将来自不同来源的文章存储在 MySQL 表中,并允许用户检索按日期排序的文章。文章总是按来源过滤,所以对于客户选择我们总是有
WHERE source_id IN (...,...) ORDER BY date DESC/ASC
Run Code Online (Sandbox Code Playgroud)
我们使用 IN,因为用户有很多订阅(有些有数千个)。
这是文章表的架构:
CREATE TABLE `articles` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`source_id` INTEGER(11) UNSIGNED NOT NULL,
`date` DOUBLE(16,6) NOT NULL,
PRIMARY KEY (`id`),
KEY `source_id_date` (`source_id`, `date`),
KEY `date` (`date`)
)ENGINE=InnoDB
AUTO_INCREMENT=1
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
COMMENT='';
Run Code Online (Sandbox Code Playgroud)
我们需要(日期)索引,因为有时我们在这个表上运行后台操作而不按源过滤。但是,用户不能这样做。
该表有大约 10 亿条记录(是的,我们正在考虑对未来进行分片......)。一个典型的查询如下所示:
SELECT a.id, a.date, s.name
FROM articles a FORCE INDEX (source_id_date)
JOIN sources s ON s.id = a.source_id
WHERE a.source_id IN (1,2,3,...)
ORDER BY a.date DESC …Run Code Online (Sandbox Code Playgroud)