Задавайте вопросы, мы ответим
Вы не зашли.
Допустим, есть таблица городов со следующими полями:
'id'=>'MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT "id города"',
'country_id' => 'SMALLINT NOT NULL DEFAULT "0" COMMENT "id страны, к которой принадлежит город"',
'region_id' => 'SMALLINT NOT NULL DEFAULT "0" COMMENT "id региона, к которому принадлежит город"',
'name' => 'VARCHAR(64) NOT NULL COMMENT "Название города по MaxMind GeoIP"'
В этой таблице country_id и region_id являются FK, но при этом для оптимизации поиска не помешает составной индекс на оба поля. Возможно именно в этой таблице это лишнее, но похожие ситуации есть у более объёмных таблиц, и FK может быть больше двух. В итоге мы получаем 3 индекса, которые дублируют друг друга + уникальный индекс на поле name (куда ж без него), и у нас размер индекса становится больше данных, или около того
Отсюда вопрос: на сколько это нормальная практика? Не хочется, чтобы индексы занимали места почти как данные всей таблицы. Убирать FK вроде тоже не совсем разумно.
Направьте плз на правильную структуру
Неактивен
То, что индексы могут занимать больше, чем данные - нормальная практика. Это может быть плохо, если таблицы перестанут помещаться на диск или сильно замедлятся операции INSERT и UPDATE. В каждом конкретном случае нужно решать, что важнее.
Использование FOREIGN KEY приводит к падению производительности, но это плата за согласованность данных (если требуется).
Неактивен
Ясно, спасибо.
Неактивен
rgbeast написал:
Использование FOREIGN KEY приводит к падению производительности, но это плата за согласованность данных (если требуется).
Потеря производительности только на запись ? Я так понимаю на чтение это не должно влиять ?
Неактивен
evgeny написал:
Потеря производительности только на запись ? Я так понимаю на чтение это не должно влиять ?
В основном только при обновлении. Увеличение объема таблицы может влиять и на скорость select, но обычно это не так существенно.
Неактивен