Подсказка SQLite, что определенный столбец всегда сортируется - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующая таблица в базе данных SQLite

CREATE TABLE `log` (
  `time` REAL NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `data` BLOB NOT NULL
) WITHOUT ROWID;

CREATE INDEX `time_index` ON `log`(`time`);

Индекс создан, потому что наиболее частый запрос будет

SELECT * FROM `log` WHERE `time` BETWEEN ? AND ?

Поскольку время будет всегда текущим временем, когда добавляется новая запись, индекс здесь на самом деле не требуется. Поэтому я хотел бы «сообщить» движку SQLite что-то вроде «». Строки будут добавлены в столбце «время», значение которого всегда будет увеличиваться (аналогично AUTO_INCREMENT), и если что-то пойдет не так, я возьму на себя всю ответственность ».

Возможно ли это вообще?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы не хотите отдельный индекс. Вы хотите объявить столбец первичным ключом:

CREATE TABLE `log` (
  `time` REAL NOT NULL DEFAULT CURRENT_TIMESTAMP PRIMARY KEY,
  `data` BLOB NOT NULL
) WITHOUT ROWID;

Это создает отдельный индекс b-дерева для log на основе первичного ключа. В других базах данных эта структура будет называться «кластеризованным индексом». Возможно, вы уже прочитали документацию , но я все равно на нее ссылаюсь.

0 голосов
/ 12 ноября 2018

У вас будет проблема, или нет, в зависимости от того, как вы считаете, что вы не можете использовать: -

CREATE TABLE `log` (
  `time` REAL NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `data` BLOB NOT NULL
) WITHOUT ROWID;

потому что: -

Каждая таблица БЕЗ ROWID должна иметь ПЕРВИЧНЫЙ КЛЮЧ. Возникла ошибка если в инструкции CREATE TABLE с предложением WITHOUT ROWID отсутствует ОСНОВНОЙ КЛЮЧ. Кластерные индексы и оптимизация БЕЗ ПУТИ

Таким образом, вы также можете сделать столбец time ПЕРВИЧНЫМ КЛЮЧОМ.


но проблема в том, что точность REAL недостаточна для обработки микросекундное разрешение, и, следовательно, две соседние записи могут иметь то же самое время, которое нарушает ограничение PRIMARY KEY.

Тогда вы могли бы использовать составной ПЕРВИЧНЫЙ КЛЮЧ, где требуемая точность удовлетворяется несколькими столбцами (второй столбец, вероятно, более чем достаточен), возможно, в соответствии с: -

CREATE TABLE log (
    time_datepart INTEGER, 
    time_microsecondpart, 
     data BLOB NOt NULL, 
     PRIMARY KEY (time_datepart,time_microsecondpart)
) WITHOUT ROWID;

Столбец time_microsecondpart не обязательно должен быть микросекундами, это может быть счетчик, полученный из другой таблицы, аналогично тому, как таблица sqlite_sequence используется при использовании AUTOINCREMENT (за вычетом необходимости в столбце, который содержит имя таблицы, к которой прикреплена строка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...