1) ВЫ НАСТОЯТЕЛЬНО рекомендуете заменить слово «гость» на NULL или на специальную «xxxxxyyyyyzzzzz00000» (20 символов, таких как «очень специальная и зарезервированная» строка), чтобы вы могли использовать chars (20) дляTable2.memberid, поскольку все значения имеют тип char (20)?
Смешивание значений из разных доменов всегда вызывает проблемы.Лучше всего исправить основную структурную проблему.Плохой дизайн может обойтись очень дорого, а исправить его может быть очень дорого.
Вот вкратце проблема.Самым простым ограничением целостности данных для такого рода проблем является ограничение внешнего ключа.Вы не можете использовать один, потому что "гость" не член.(Идентификаторы участников из одного домена; «гость» не является частью этого домена; вы смешиваете значения из двух доменов.) Использование NULL для идентификации гостя мало помогает;Вы не можете отличить гостей от участников, чей член отсутствует.(Использование NULL для идентификации чего-либо обычно является плохой идеей.)
Если , вы можете использовать специальный 20-значный идентификатор участника для идентификации всех гостей, возможно, было бы разумно сделать это.Возможно, вам повезет, в этом «госте» пять букв.Если вы можете использовать «guestguestguestguest» для гостей, не нарушая логику своего приложения, я бы действительно подумал об этом в первую очередь.(Но вы сказали, что, похоже, вы относитесь к гостям как к зарегистрированным пользователям, что, по-моему, может сломать ситуацию.)
Я думаю, что дооснащение супертипа "пользователи" возможно, и это может оказаться лучшим в целом.решение.Супертип позволит вам относиться к участникам и гостям как к одному и тому же (потому что они не совсем разные), так и к другим в другое время (потому что они не совсем одинаковые).Супертип также позволяет как отдельным лицам (членам), так и совокупным пользователям (гостям все вместе) без чрезмерной нагрузки.И это объединит два домена, чтобы вы могли использовать ограничения внешнего ключа для участников.Но для этого потребуется изменить логику программы.
В Таблице 2 (и, пожалуйста, do найдите более подходящее имя, чем это), индекс на memberid или составной индекс на memberid и status будут выполнятьпочти так же, как вы можете ожидать.Я не уверен, поможет ли составной индекс;«status» имеет только два значения, поэтому он не очень избирателен.
все значения, кроме 'guest', на самом деле являются внешними ключами.Можно ли использовать эту информацию для повышения производительности?
Нет, это не внешние ключи.(См. Выше.) Истинные внешние ключи помогут с целостностью данных, но не с производительностью SELECT.
«Повышение производительности» в значительной степени бессмысленно.Производительность - это балансирование.Если вы хотите повысить производительность, вам нужно указать, какую часть вы хотите улучшить.Если вы хотите более быструю вставку, удалите индексы и ограничения целостности.(Не делайте этого.) Если вы хотите более быстрые операторы SELECT, создайте больше индексов.(Но больше индексов замедляет вставки.)
Вы можете повысить производительность всей базы данных, перейдя на оборудование, которое повышает производительность всей базы данных.(Гм) Более быстрый процессор, более быстрые диски, более быстрая дисковая подсистема, больше памяти (обычно).Перемещение критических таблиц или индексов на твердотельный диск может привести к поломке носков.
Может помочь настройка вашего сервера.Но следите за общей эффективностью.Не стоит слишком увлекаться ускорением одного запроса, чем снижать производительность во всех остальных.В идеале, напишите тестовый набор и решите, какая скорость достаточно хороша, прежде чем приступать к тестированию.Например, скажем, у вас есть один запрос, который занимает 30 секунд.Какое приемлемое улучшение?20 секунд?15 секунд?2 миллисекунды звучат хорошо, но вряд ли цель для запроса, который занимает 30 секунд.(Хотя я наблюдал такой рост производительности при переходе к улучшенной структуре таблиц и индексов.)