2012-02-20 3 views
1

Извините, я просто играю с mysql и учась, когда я иду. Вот моя проблема. У меня есть таблица (в python) с номерами значений (например, {3: 1,3: 2,3: 3}). Я хочу использовать базу данных как хранилище сохранения этих переменных (поскольку они не полностью соответствуют памяти), но я хочу попытаться сделать это как можно быстрее.Могу ли я сделать два столбца уникальными друг для друга?

В настоящее время я просто использую один столбец (индексированный) в mysql, и каждая запись в словаре получает свою собственную строку. Я хотел попытаться проверить, могу ли я ускорить чтение/запись, если бы я использовал два столбца INT вместо столбца CHAR, но мне нужны оба столбца для того, чтобы быть уникальными друг для друга. В приведенном выше примере все данные уникальны, и если я добавлю еще 3 = 1, то он просто перезапишет существующее значение, но 3 = 4 создаст новую запись. Как я могу реплицировать это в mysql?

Также ли моя логика об ускорении имеет смысл или будет ли выбор на двух столбцах фактически более дорогим, чем один?

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

Спасибо!

+1

Вы ищете композитный первичный ключ? – Asdfg

+0

Я бы предложил разбивать 'varchar' на два' ints' ... не по соображениям производительности, а для [правильной нормализации] (http://en.wikipedia.org/wiki/Database_normalization). Во-первых, заставьте его работать - во-вторых, сделайте все правильно - наконец, беспокойтесь о том, чтобы сделать это быстро. –

+0

@Asdfg Я так думаю, сейчас у меня только одна колонка, поэтому я хочу посмотреть, могу ли я ее разбить. @ Michael Я пытаюсь дать ему шанс. Сейчас это работает, но я чувствую, что mysql может быть быстрее, поэтому я просто тестирую различные подходы и сравниваю его с предыдущими результатами (и гарантируя, что результаты одинаковы) – Lostsoul

ответ

4

Короткая версия, что вы можете иметь несколько столбцов в уникальный индекс

// Create the test table 
CREATE TABLE testTable (
    col1 INT UNSIGNED NOT NULL, 
    col2 INT UNSIGNED NOT NULL, 
    col3 VARCHAR NOT NULL, 
    PRIMARY KEY (col1,col2) 
); 

Это добавит столбец с именем uniqueOnCol1AndCol2 на стол TESTTABLE. Затем вы можете использовать INSERT запрос следующим образом

INSERT INTO testTable (
    col1, 
    col2, 
    col3 
) VALUES (
    3, 
    1, 
    'Original value' 
) ON DUPLICATE KEY UPDATE 
col1 = VALUES(col1) 

Это было бы вставить (3,1, 'Исходное значение') в TESTTABLE. После с

INSERT INTO testTable (
    col1, 
    col2, 
    col3 
) VALUES (
    3, 
    1, 
    'New value' 
) ON DUPLICATE KEY UPDATE 
col1 = VALUES(col1) 

затем перезаписать col3 и сделать его «Новое значение»

+0

Удивительно, я не понимал, что это возможно. Спасибо. – Lostsoul

+0

Прошу прощения, у меня проблема. На самом деле мне не нужен третий столбец. Только первые два у вас есть (у меня есть наборы чисел в строке). Когда я пытаюсь добавить эти два набора чисел в вашу вышеприведенную команду, он работает на 3,1, но если я попытаюсь добавить 3,2, я получу дублируемую ошибку первичного ключа для col1. Имеет смысл, но есть ли способ обойти это, используя как col1, так и col2 в качестве совместного типа первичного ключа? – Lostsoul

+0

Я обновил пример - я забыл о ПК, поэтому изменил PK на col1, col2 - он будет работать одинаково для целей ваших целей предотвращения дублирования col1, col2-комбинаций, col3 можно просто выбросить, если не нужно –

2

, чтобы сделать пару колонок уникальных, вы объявляете уникальный индекс на обоих столбцах. что-то вроде этого:

create unique index myindex on mytable(col1, col2)

1

Использование UNIQUE ограничение для обоих столбцов и использовать REPLACE вместо INSERT. Не знаете, какие преимущества в производительности вы говорите, и откуда берется varchar.