суррогат по сравнению с естественным ключом: твердые числа на различиях в производительности?

Раздел конфигурации кажется звуковым, поскольку он работает если, когда к страницам обычно получают доступ. Я попробовал другие предложенные конфигурации, но проблема все еще там.

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

8
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

Используйте оба! Естественные ключи предотвращают повреждение базы данных (лучше сказать «несогласованность»). Когда «правильный» естественный ключ (для устранения повторяющихся строк) будет работать плохо из-за длины или количества задействованных столбцов, в целях повышения производительности можно добавить суррогатный ключ, который будет использоваться в качестве внешних ключей в других таблицах вместо естественный ключ ... Но естественный ключ должен оставаться в качестве альтернативного ключа или уникального индекса, чтобы предотвратить повреждение данных и обеспечить согласованность базы данных ...

Большая часть ура (в «дебатах» по этому вопросу) может быть из-за того, что является ложным предположением - что вы должны использовать Первичный ключ для объединений и внешних ключей в других таблицах. ЭТО ЛОЖЬ. Вы можете использовать ЛЮБОЙ ключ в качестве цели для внешних ключей в других таблицах. Это может быть первичный ключ, альтернативный ключ, или любой уникальный индекс, или уникальное ограничение. А что касается объединений, вы можете использовать что угодно для условия объединения, оно даже не должно быть ключом, или идентификатором, или даже уникальным !! (хотя, если он не уникален, вы получите несколько строк в декартовом произведении, которое оно создает).

9
ответ дан 5 December 2019 в 14:05
поделиться

Естественные ключи отличаются от суррогатных ключей значением, а не типом.

Для суррогатного ключа может использоваться любой тип, например VARCHAR для сгенерированного системой slug или что-то еще.

Однако наиболее часто используемые типы для суррогатных ключей - это INTEGER и RAW (16) (или любой другой тип вашей RDBMS действительно используется для GUID ),

Сравнение суррогатных целых и натуральных чисел (например, SSN ) занимает точно такое же время.

Сравнение VARCHAR ] учитывают сопоставление, и они обычно длиннее целых, что делает их менее эффективными.

Сравнение набора из двух INTEGER , вероятно, также менее эффективно, чем сравнение одного INTEGER .

Для небольших по размеру типов данных эта разница, вероятно, составляет процентов времени, необходимого для выборки страниц, обхода индексов, получения защелок базы данных и т. Д.

И вот числа (в MySQL ):

CREATE TABLE aint (id INT NOT NULL PRIMARY KEY, value VARCHAR(100));
CREATE TABLE adouble (id1 INT NOT NULL, id2 INT NOT NULL, value VARCHAR(100), PRIMARY KEY (id1, id2));
CREATE TABLE bint (id INT NOT NULL PRIMARY KEY, aid INT NOT NULL);
CREATE TABLE bdouble (id INT NOT NULL PRIMARY KEY, aid1 INT NOT NULL, aid2 INT NOT NULL);

INSERT
INTO    aint
SELECT  id, RPAD('', FLOOR(RAND(20090804) * 100), '*')
FROM    t_source;

INSERT
INTO    bint
SELECT  id, id
FROM    aint;

INSERT
INTO    adouble
SELECT  id, id, value
FROM    aint;

INSERT
INTO    bdouble
SELECT  id, id, id
FROM    aint;

SELECT  SUM(LENGTH(value))
FROM    bint b
JOIN    aint a
ON      a.id = b.aid;

SELECT  SUM(LENGTH(value))
FROM    bdouble b
JOIN    adouble a
ON      (a.id1, a.id2) = (b.aid1, b.aid2);

t_source - это просто фиктивная таблица с 1,000,000 строк.

aint и adouble , bint ] и bdouble содержат точно такие же данные, за исключением того, что aint имеет целое число как ПЕРВИЧНЫЙ КЛЮЧ , а adouble имеет пару из двух идентичные целые числа.

На моей машине оба запроса выполняются в течение 14,5 секунд, +/- 0,1 секунды

Разница в производительности, если таковая имеется, находится в пределах диапазона колебаний.

А вот числа (в MySQL ):

CREATE TABLE aint (id INT NOT NULL PRIMARY KEY, value VARCHAR(100));
CREATE TABLE adouble (id1 INT NOT NULL, id2 INT NOT NULL, value VARCHAR(100), PRIMARY KEY (id1, id2));
CREATE TABLE bint (id INT NOT NULL PRIMARY KEY, aid INT NOT NULL);
CREATE TABLE bdouble (id INT NOT NULL PRIMARY KEY, aid1 INT NOT NULL, aid2 INT NOT NULL);

INSERT
INTO    aint
SELECT  id, RPAD('', FLOOR(RAND(20090804) * 100), '*')
FROM    t_source;

INSERT
INTO    bint
SELECT  id, id
FROM    aint;

INSERT
INTO    adouble
SELECT  id, id, value
FROM    aint;

INSERT
INTO    bdouble
SELECT  id, id, id
FROM    aint;

SELECT  SUM(LENGTH(value))
FROM    bint b
JOIN    aint a
ON      a.id = b.aid;

SELECT  SUM(LENGTH(value))
FROM    bdouble b
JOIN    adouble a
ON      (a.id1, a.id2) = (b.aid1, b.aid2);

t_source - это просто фиктивная таблица с 1,000,000 строк.

aint и adouble , bint и bdouble содержат точно такие же данные, за исключением того, что aint имеет целое число в качестве ПЕРВИЧНОГО КЛЮЧА , в то время как adouble имеет пару двух одинаковых целых чисел.

На моей машине оба запроса выполняются в течение 14,5 секунд, +/- 0,1 секунды

Разница в производительности, если таковая имеется, находится в пределах диапазона колебаний.

А вот числа (в MySQL ):

CREATE TABLE aint (id INT NOT NULL PRIMARY KEY, value VARCHAR(100));
CREATE TABLE adouble (id1 INT NOT NULL, id2 INT NOT NULL, value VARCHAR(100), PRIMARY KEY (id1, id2));
CREATE TABLE bint (id INT NOT NULL PRIMARY KEY, aid INT NOT NULL);
CREATE TABLE bdouble (id INT NOT NULL PRIMARY KEY, aid1 INT NOT NULL, aid2 INT NOT NULL);

INSERT
INTO    aint
SELECT  id, RPAD('', FLOOR(RAND(20090804) * 100), '*')
FROM    t_source;

INSERT
INTO    bint
SELECT  id, id
FROM    aint;

INSERT
INTO    adouble
SELECT  id, id, value
FROM    aint;

INSERT
INTO    bdouble
SELECT  id, id, id
FROM    aint;

SELECT  SUM(LENGTH(value))
FROM    bint b
JOIN    aint a
ON      a.id = b.aid;

SELECT  SUM(LENGTH(value))
FROM    bdouble b
JOIN    adouble a
ON      (a.id1, a.id2) = (b.aid1, b.aid2);

t_source - это просто фиктивная таблица с 1,000,000 строк.

aint и adouble , bint и bdouble содержат точно такие же данные, за исключением того, что aint имеет целое число в качестве ПЕРВИЧНОГО КЛЮЧА , в то время как adouble имеет пару двух одинаковых целых чисел.

На моей машине оба запроса выполняются в течение 14,5 секунд, +/- 0,1 секунды

Разница в производительности, если таковая имеется, находится в пределах диапазона колебаний.

за исключением того, что aint имеет целое число в качестве ПЕРВИЧНОГО КЛЮЧА , а adouble имеет пару двух одинаковых целых чисел.

На моем компьютере оба запроса выполняются для 14,5 секунды, +/- 0,1 секунды

Разница в производительности, если таковая имеется, находится в пределах диапазона колебаний.

за исключением того, что aint имеет целое число в качестве ПЕРВИЧНОГО КЛЮЧА , а adouble имеет пару двух одинаковых целых чисел.

На моей машине оба запроса выполняются для 14,5 секунды, +/- 0,1 секунды

Разница в производительности, если таковая имеется, находится в пределах диапазона колебаний.

3
ответ дан 5 December 2019 в 14:05
поделиться
Другие вопросы по тегам:

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