Я проделал много поиска/чтения по этой теме, но я все еще не в состоянии решить проблему.Скорость MySQL SELECT (индексы стоят на столбцах с небольшим изменением)?
У меня есть таблицы с десятками или сотнями тысяч строк, общаясь где-то в области 300 ГБ данных. Столбец, который мне нужно выбрать, содержит много HTML, которые могут быть частью проблемы. Я использую COMPRESS. Запрос содержит два предложения 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
и только запустил предложение 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
Я ценю ваше время в чтении и предлагая любую помощь, что вы можете.
Просто идея, я даже не уверен, как вы это сделаете, но я думаю, что вы можете пометить половину своей таблицы, а затем запустить два запроса одновременно (разветвление или что-то в этом роде) одним движением через первую половину, и один проходит через вторую половину стола. – throwaway2013
Если вы добавили составной индекс для анализа и очистки, запрос будет быстрым. Индекс, как вы говорите, будет болезненным. Почему вы получаете нужное значение, как в первом случае, когда СУБД сталкивается (Limit 1)? –
@CppandQtBeginner Я рассмотрю это как возможное решение. –