Вот как я об этом думаю, может быть, вы найдете это полезным ... может быть, нет. Обратите внимание, что я думаю, что написание if constexpr (std::is_constant_evaluated())
будет действительно распространенной ошибкой, и в нее легко попасть. Но, надеюсь, компиляторы просто диагностируют этот случай.
По сути, у нас есть два разных правила для кода - типичные правила для нормального кода времени выполнения и ограничения для константных выражений, которые применяются для программирования constexpr
. Это ограничения expr.const: нет UB, нет reinterpret_cast
и т. Д. Эти ограничения продолжают уменьшаться от языкового стандарта к языковому стандарту, и это здорово.
По существу, поток управления (с точки зрения пути кода) чередуется между режимом «полного времени выполнения» и режимом constexpr
. Как только мы войдем в режим constexpr
(будь то инициализация объекта constexpr
или оценка параметра шаблона или ...), мы останемся там, пока не закончим ... и затем вернемся к полному режиму выполнения.
Что is_constant_evaluated()
делает просто: я в режиме constexpr? Он сообщает вам, если вы находитесь в контексте, который требует константных выражений.
С этой точки зрения, давайте посмотрим на if constexpr (is_constant_evaluated())
. Независимо от того, в каком состоянии мы были, if constexpr
требуется постоянное выражение в качестве инициализированного, так что это переводит нас в режим constexpr, если мы еще не были там. Следовательно, is_constant_evaluated()
просто верно - безусловно.
Однако, для if (is_constant_evaluated())
, простой if
не меняет наше состояние между временем выполнения и constexpr. Таким образом, значение здесь зависит от контекста, из которого он был вызван. Инициализация test4
переводит нас в режим constexpr, потому что это объект constexpr. Во время его инициализации мы следуем правилам константных выражений ... поэтому is_constant_evaluated()
верно. Но как только мы закончим, мы вернемся к правилам времени выполнения ... поэтому при инициализации test5
, is_constant_evaluated()
ложно. (И затем test6
- это особый случай, к сожалению, язык - вы можете использовать постоянные целочисленные переменные в качестве константных выражений, поэтому мы используем их инициализацию одинаково для этих целей.)
Я верю, создали ли Вы свой уникальный индекс как (user_id
, date_expired
, foreign_id
), Вы извлечете ту же пользу из наличия нормального индекса на user_id
только с уникальным индексом. MySQL может использовать первые столбцы любого индекса для срезания количества строк в соединении таким же образом как индекс на user_id
.
См. индексную документацию MySQL для получения дополнительной информации.
Вы обращаетесь к id
столбец auto_increment в другом месте в Вашей схеме для оставления свободного места? Так как Ваш уникальный индекс покрывает все другие столбцы в Вашей таблице, это - в сущности сам первичный ключ и могло быть отброшено, если Вы не.
Можно проверить, какие ключи запрос использует путем добавления префикса его, ОБЪЯСНЯЮТ.
Я не понимаю то, что делает Вы подразумеваете под дублирующимися индексами. У Вас есть три индекса в таблице:
таким образом, нет никакого дублирования, у Вас есть три различных индекса, это сделает разные вещи. Вам нужен номер 3 для ускорения запросов, связанных с user_id, который является тем, что Вы видите. Таким образом, нет ничего неправильно с этой конкретной таблицей, Вы ничего не копируете. Относительно второго вопроса это зависит от Ваших потребностей, но конечно это не плохо, чтобы иметь больше пространства, израсходованного в индексах, чем в данных.
То, что было бы плохо, например, должно иметь УНИКАЛЬНОЕ ('user_id') и позже КЛЮЧ ('user_id') (я даже не уверен, признает ли MySQL, что), потому что один индекс содержал бы другой и нет ничего для получения.
Наличие нескольких индексов включая одно поле не плохо вообще (по существу, они действительно индексируют разные вещи). Это оказывает небольшое влияние на производительность записи, но это - типичный компромисс, который Вы имеете с каждым индексом в первом месте. Наличие индексов, съедающих больше пространства, чем сами данные, не плохо, если пространство является дешевым. В Вашем случае это должно быть дешево учитывая тот факт, что у Вас есть действительно небольшое количество записей.
Вопрос, который я задал бы в Вашем положении: Как делает индексацию такой маленькой таблицы, таким образом, severly влияют на мое время выполнения запроса? Возможно, Вы делаете что-то не так (я думаю о большом количестве возможно избыточных запросов к этой таблице), поскольку единственный нигде не должен быть, рядом на этот раз располагаются с этим небольшим количеством записей).