问题
我有以下表定义:
id BIGINT
resource_id INT
timestamp DATETIME
data JSON
主键是id,我在(resource_id, timestamp)上有一个索引。数据是一个 json 对象(3KB),在这个 FLOAT 类型的对象中有 5 个参数(除其他外)定期获取。表大小约为 60GB 和 15,000,000 行。每分钟记录每个资源 ID 的数据。
我想优化以下查询:
SELECT
resource_id
timestamp
data->'$.p1' /* can also include the other parameters in the select p2-p5 */
FROM table
WHERE resource_id = ? AND timestamp BETWEEN ? AND ?;
我试过的
- 为每个参数创建一个虚拟列并为每个参数创建一个索引(resource_id, timestamp, pX)。这将查询从 70 秒显着提高到 8 秒(获取 6 个月),但我担心索引的数量会减慢我的插入速度。此外,我不能再在查询中包含多个参数,因为只能使用一个索引。
我还研究了按 resource_id 进行的分区,但我不确定这是否会有所帮助,因为 mysql 将分区限制为 8192,并且资源很容易超过这个值。
关于如何以 mysql 允许的速度获取这些数据的任何想法?