所以我有一个包含大量数字数据的表:http ://sqlfiddle.com/#!9/dfdb35/4/0
目前有 60M 行。
我需要查询这些数据以获取特定date_added
和的最接近的行name
,上面的示例有我为此使用的查询(我使用>= 'targetdate'
并LIMIT 1
获得最接近的)。
我的问题是这些数据不是按日期排序的,所以在返回结果时我需要包含ORDER BY date_added
(或者它不返回正确的行)。由于这种情况,目前在 60M 行上执行此操作需要 90 秒才能运行ORDER BY
。
有什么方法可以进一步优化吗?我已经索引了date_added
andname
列,所以我不确定还能做什么。我考虑创建一个按date_added
顺序重新排序数据的新表,但这不切实际,因为需要定期添加旧数据的新条目。
我已将数字数据存储为十进制,因为它可能非常小(例如0.0000243
),但它也可能非常大(例如12345678
)或两者兼而有之(例如12345678.0000243
)。也许以不同的方式存储这些数据会更有效?有任何想法吗?我已经命令这本书High Performance MySQL
自己继续研究这个问题,但这在一段时间内不会令人讨厌,而且这个表增长得相当快,所以问题正在恶化(每天增加大约 300k 行)。
的输出EXPLAIN
:
id: 1
select_type: SIMPLE
table: numeric_data
partitions: NULL
type: range
possible_keys: date_added,name
key: date_added
key_len: 5
ref: NULL
rows: 29222232
filtered: 0.16
Extra: Using index condition; Using where