2013-08-14 3 views
1

У меня есть таблица, которая содержит 70 тысяч строк, и в течение нескольких месяцев она будет медленно расти примерно до 140 тысяч.Индекс столбцов низкой мощности VS-таблицы накладных расходов

У меня есть 4 столбца с низкой мощностью, которые содержат значения 0/1, как в FALSE/TRUE. У меня есть накладные расходы на таблицы (после оптимизации) из 28 МБ с размером стола 6 МБ. Я добавил 4 отдельных простых индекса для этих 4 столбцов. Мои накладные расходы упали до 20 МБ.

Я понимаю, что индексный столбец с низкой мощностью (где много строк, но несколько разных значений) практически не влияет на производительность запросов, но мои накладные расходы упали. И накладные расходы увеличиваются без этих индексов. Должен ли я удерживать более низкие накладные расходы или я должен держать потенциально бессмысленные индексы? Что влияет на производительность больше всего?

P.S. Таблица в основном считывается с переменной нагрузкой от тысяч запросов в минуту до сотен запросов в день. Записи - это в основном обновления этих 4 булевых столбцов или одного столбца временной метки.

+0

Беспокойство о мощности было бы микро-оптимизацией на этом этапе. См. Ответ ниже. – FredTheWebGuy

ответ

1

Индексы не имеют смысла при приближении к размерам таблиц, содержащих десятки миллионов строк, и вы увидите только незначительные улучшения в производительности запросов при работе с размером таблицы, с которым имеете дело сейчас.

Вам лучше оставить индексы так, как они есть, и пересмотреть схему БД. В запросе не должно использоваться 20 + МБ памяти, и его производительность будет только снегом в гораздо большую проблему по мере роста БД.

Это говорит о том, что прыжки с 70 тыс. Строк до 150 тыс. Строк - это не огромный скачок в вашей типичной базе данных mysql. Если производительность уже вызывает озабоченность, здесь уже стоит гораздо большая проблема. Например, если вы храните большие капли в своей БД, вам может быть лучше хранить ваши данные в файле и сохранить его местоположение в качестве поля varchar в вашей таблице.

Еще одна вещь, которую нужно учитывать, если вам абсолютно необходимо сохранить схему БД именно так, как она есть, - это рассмотреть раздел ваших данных. Обычно вы можете разбивать таблицу на ID или на дату и видеть значительное улучшение производительности.

+0

Я не мог найти правильное определение «Накладные расходы MySQL InnoDB». Я подумал, что на диске хранятся дополнительные данные, кроме самих данных таблицы, таких как кеш и временные индексы. Я ошибаюсь? Используются ли эти запросы на память объемом 28 МБ? Раньше я делал разделы таблиц, производительность повышалась (теперь у меня есть эта, первичная, таблица и еще одна с менее доступными данными размером 17 МБ). – Xeos

+1

Вы правы! Вот совет: попробуйте сделать «EXPLAIN EXTENDED» перед одним из этих больших запросов, чтобы действительно увидеть, что происходит за кулисами. Этот запрос выполняет полное сканирование таблицы? Ваш следующий вопрос о SO, несомненно, будет тем, что означает этот материал, но это важно знать ... Еще одна вещь, которую следует учитывать, - это сначала сортировать данные, т. Е. ORDER BY X DESC. Большие данные, отсортированные сначала, будут использовать механизм filesort в MYSQL, еще один убийца памяти. Удачи! – FredTheWebGuy

Смежные вопросы