MySQL: увеличение идентификатора текста в БД - PullRequest
5 голосов
/ 10 декабря 2010

Мне нужно иметь текстовые идентификаторы в моем приложении. Например, у нас есть приемлемый набор символов azAZ09 и допустимый диапазон идентификаторов [aaa] - [cZ9]. Сначала сгенерированный идентификатор будет aaa, затем aab, aac, aad e.t.c.

Как можно вернуть ID и увеличить нижнюю границу в режиме транзакций? (при условии, что есть сотни одновременных запросов, и все должны иметь правильный результат)

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

Также обратите внимание, что количество идентификаторов в диапазоне может превышать 2 ^ 32.

Другая идея состоит в том, чтобы иметь диапазоны 64-битных целых чисел и преобразовывать целое число -> идентификатор кода в программный код, где это можно сделать асинхронно.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 09 января 2011

Решение, основанное на long (bigint) числах, с преобразованиями символов в числа и числа в символы, выполненными в программном обеспечении, имеющем, скажем, 32 различных диапазона,

  • создание 32 таблиц range0 .. range31 для снижения нагрузки (уникальная таблица с 32 полями диапазона будет блокировать строку каждый раз, когда записывается диапазон)

  • запуск диапазоновустановив для auto_increment очень высокое значение на 64 бита - возможно, на 63, если вы хотите избежать проблемы со знаком в вашем приложении.В идеале значение диапазона в 5 битах, от 0 до 31. 1-битный знак + 5-битный диапазон = 6 бит.Ваш счетчик будет от 1 до (2 ^ 58-1) или 10 ^ 17 ... этого должно быть достаточно.

  • в программном обеспечении номер диапазона выбирается случайным образом, и запрос имя таблицы строится соответственно range i, где i изменяется от 0 до 31.

Команды создания таблиц были бы чем-токак, скажем, в Java

  String table;
  String query;
  long increment;

  for (long i=0 ; i<32 ; i++) {
    table = "range"+i;
    increment = (i<<58) + 1;
    query = "CREATE TABLE "+table+" (v bigint auto_increment primary key) auto_increment="+increment;

    do_query(query);
  }
1 голос
/ 09 января 2011

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

Посмотрите, что ваша база данных предлагает в плане управленияпоследовательности.Некоторые из них могут справиться с чем-то вроде этого.Если ваша база данных этого не делает, я бы посмотрел на «копилку» на ее обычных цифровых клавишах, поскольку они уже решают все проблемы, которые вы ожидаете.цифровые клавиши, как обычно, начиная с 0. Затем напишите две функции для преобразования между этими числами и вашими текстовыми клавишами.У вас есть некоторая гибкость: вы можете реализовать эту функцию в базе данных (используя второй столбец, триггеры или какую-нибудь интересную функцию базы данных) или на уровне вашего сервера, например Java.Это не будет так сложно.В конце концов, это все биты в любом случае ... ваш текстовый ключ это просто другой способ нарезать биты.

Удачи!

...