【发布时间】:2013-06-28 19:36:02
【问题描述】:
我已经对此主题进行了大量搜索/阅读,但我仍然找不到解决方案。
我有数万行或数十万行的表,总数据量在 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 秒才能返回结果,这是完全不可行的。奇怪的是(至少对我而言),删除 parse_status 的 WHERE 子句会导致查询在 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
感谢您抽出宝贵时间阅读并提供任何可能的帮助。
【问题讨论】:
-
只是一个想法,我什至不确定你会怎么做,但我认为你可以标记表的中点,然后同时运行两个查询(分叉或类似那)一个通过前半部分,一个通过你的表的后半部分。
-
如果你在解析和抓取状态上添加了一个复合索引,查询会很快。你说的索引会很痛苦。为什么你会得到你想要的值,就像 DBMS 遇到的第一个值一样,(限制 1)?
-
@CppandQtBeginner 我会考虑将其作为可能的解决方案。
-
如果您从中删除
compress(source_html),查询需要多长时间? -
@TonyHopkinson 也会研究复合索引。我得到这样的值是因为它处于“无限”循环中,获取第一个未解析的记录,然后解析它。您如何建议这样做?
标签: mysql select indexing where