我已经对这个主题进行了大量搜索/阅读,但我仍然无法找到解决方案。
我有数万行或数十万行的表,总数据量在 300GB 左右。我需要选择的列包含很多 HTML,这可能是问题的一部分。我正在使用压缩。该查询包含两个 WHERE 子句:
SELECT id, olr_id, COMPRESS(source_html)
FROM buildings
WHERE scrape_status=1
AND parse_status=0 LIMIT 1;
正如人们所预料的那样,id 是一个主键。此外,olr_id 是唯一索引。此查询需要 160-300 秒才能返回结果,这是完全不可行的。奇怪的是(至少对我而言),删除 WHERE 子句以parse_status
使查询在 2-3 秒内完成。起初,我想这可能是因为它太具体了,所以我什至尝试删除scrape_status
并只运行parse_status
WHERE 子句,但显然正是这个特定的子句导致了执行时间的疯狂增加。
问题是,我不知道对这些列进行索引是否有任何好处(scrape_status
和parse_status
),因为它们的值范围是 0-2。我想这是我的主要问题——对值差异如此小的列进行索引是否有帮助?我曾经在某处读过,索引确实最适合变化很大的列,但正如我所说,我对想法感到茫然,对于数十万条记录来说,160-300 秒是完全不合理的。
任何输入将不胜感激。如果您需要其他输入来帮助我,我很乐意提供。关于这一点,这些是三个查询中每一个的 EXPLAIN 结果:
id: 1
select_type: SIMPLE
table: building
type: ALL
possible_keys: null
key: null
key_len: null
ref: null
rows: 58664
Extra: Using where
感谢您花时间阅读并提供您可能的任何帮助。