Как неправильно это должно иметь уникальный и нормальный индекс на том же столбце?

Вот как я об этом думаю, может быть, вы найдете это полезным ... может быть, нет. Обратите внимание, что я думаю, что написание 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 - это особый случай, к сожалению, язык - вы можете использовать постоянные целочисленные переменные в качестве константных выражений, поэтому мы используем их инициализацию одинаково для этих целей.)

6
задан Darryl Hein 15 November 2008 в 06:32
поделиться

3 ответа

Я верю, создали ли Вы свой уникальный индекс как (user_id, date_expired, foreign_id), Вы извлечете ту же пользу из наличия нормального индекса на user_id только с уникальным индексом. MySQL может использовать первые столбцы любого индекса для срезания количества строк в соединении таким же образом как индекс на user_id.

См. индексную документацию MySQL для получения дополнительной информации.

Вы обращаетесь к id столбец auto_increment в другом месте в Вашей схеме для оставления свободного места? Так как Ваш уникальный индекс покрывает все другие столбцы в Вашей таблице, это - в сущности сам первичный ключ и могло быть отброшено, если Вы не.

Можно проверить, какие ключи запрос использует путем добавления префикса его, ОБЪЯСНЯЮТ.

8
ответ дан 9 December 2019 в 20:50
поделиться

Я не понимаю то, что делает Вы подразумеваете под дублирующимися индексами. У Вас есть три индекса в таблице:

  1. Один для первичного ключа 'идентификатор' (который подразумевает уникальный),
  2. Другой уникальный для комбинации 'date_expired', 'user_id', и 'foreign_id'
  3. И третий по 'user_id' только

таким образом, нет никакого дублирования, у Вас есть три различных индекса, это сделает разные вещи. Вам нужен номер 3 для ускорения запросов, связанных с user_id, который является тем, что Вы видите. Таким образом, нет ничего неправильно с этой конкретной таблицей, Вы ничего не копируете. Относительно второго вопроса это зависит от Ваших потребностей, но конечно это не плохо, чтобы иметь больше пространства, израсходованного в индексах, чем в данных.

То, что было бы плохо, например, должно иметь УНИКАЛЬНОЕ ('user_id') и позже КЛЮЧ ('user_id') (я даже не уверен, признает ли MySQL, что), потому что один индекс содержал бы другой и нет ничего для получения.

3
ответ дан 9 December 2019 в 20:50
поделиться

Наличие нескольких индексов включая одно поле не плохо вообще (по существу, они действительно индексируют разные вещи). Это оказывает небольшое влияние на производительность записи, но это - типичный компромисс, который Вы имеете с каждым индексом в первом месте. Наличие индексов, съедающих больше пространства, чем сами данные, не плохо, если пространство является дешевым. В Вашем случае это должно быть дешево учитывая тот факт, что у Вас есть действительно небольшое количество записей.

Вопрос, который я задал бы в Вашем положении: Как делает индексацию такой маленькой таблицы, таким образом, severly влияют на мое время выполнения запроса? Возможно, Вы делаете что-то не так (я думаю о большом количестве возможно избыточных запросов к этой таблице), поскольку единственный нигде не должен быть, рядом на этот раз располагаются с этим небольшим количеством записей).

1
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: