Буду ли я сталкиваться с проблемами производительности, если я буду использовать поле большого двоичного объекта в качестве первичного ключа в SQLite? - PullRequest
10 голосов
/ 14 октября 2009

У меня есть база данных sqlite, где все первичные ключи являются GUID. В настоящее время они хранятся в виде строк фиксированной длины, но я хочу хранить их как двоичные объекты, поскольку это упрощает код для хранения и извлечения данных. Я преобразовал часть базы данных, и все работает, как ожидалось. Однако я не уверен, столкнусь ли я с проблемами производительности.

Например, будет ли подобное утверждение быстрее для строк, чем BLOB-объектов?

SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.parent_id

Моя интуиция говорит нет, но это ничего не значит.

Ответы [ 3 ]

13 голосов
/ 14 октября 2009

Лучший способ выяснить это - выполнить запросы к таймеру профилировщика / SQLite. Настройте тест и выполните запрос 1000 раз со строкой, затем 1000 раз в виде большого двоичного объекта. Победитель самый быстрый.

Интуиция - это одно, а жесткие данные - это другое.

1 голос
/ 14 октября 2009

Я думаю, что AIEE, и на вашем месте я буду хранить GUID в паре целочисленных типов в SQLITE (SQLITE INTEGER - 64 бита).

Однако в этом случае BLOB-объект может работать лучше.

LFSR прав, профилируйте его.

0 голосов
/ 14 октября 2009

Почему вы не должны его использовать

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

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

Большинство реализаций SQL не позволяют сравнивать поля BLOB, но SQLite допускает это. Тем не менее, он преобразует все, с чем вы сравниваете его, в большой двоичный объект, а затем сравнивает его по крупицам.

Лучшая альтернатива

Наилучшим вариантом для столбца первичного ключа в SQLite является использование INTEGER PRIMARY KEY, как описано здесь ;: http://www.sqlite.org/lang_createtable.html#rowid это дает наилучшую производительность (он уже существует как столбец rowid, это только псевдоним).

Заключение

Чтобы ответить на ваш вопрос: да, это плохо влияет на производительность. Но что еще более важно, это будет очень трудно хорошо управлять вашими столами. Используйте INTEGER PRIMARY KEY, это действительно лучший, гарантированный уникальный и невероятно быстрый.

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