Сравнение скорости баз данных с численными и строковыми перечислениями

Посыл

В мае сего года, Александр Кошелев написал как сделать перечисления в джанге. И большое ему за это спасибо. Но. Александр выступает за читабельную raw базу, а я против. Вот, что он пишет:

Потом, что будет если вы просмотрите raw базу? Увидите там кучу строк, где в поле “тип” какие-то не понятные числа

надо использовать строковые литералы для обозначения типа и сменить тип поля в модели на CharField. И пускай это чуть-чуть менее эффективно с точки зрения объема информации.

Уважаемый Александр! Насрать на размер базы! Не в этом дело.

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

Тест на скорость

Для теста использовалась табличка примерно такой структуры:

имятип поляиндекс
idintPK
namevarchar(100)-
passvarchar(50)-
emailvarchar(100)-
atypeint и varchar(30)index
i1float-

Табличка заполнялась примерно 2 миллионами записей, в которых все поля - случайные слова. Для atype int использовалось 7 цифр, для atype str - около 40 слов.

Тест производился на двух СУБД: SQLite 3.4 и Postgres 8.3. Нужно будет еще найти время, провести его на MySQL, конечно.

Суть теста грубо неумелая: выбрать всех юзеров where atype = каждое возможное его значение и выбрать всех юзеров group by atype.

Запросы:

SELECT COUNT() FROM tt WHERE atype=x;
SELECT COUNT(
) FROM tt GROUP BY atype;

atype integer
ктоwheregroup
SQLite0.5496.119
Postgres3.1381.371
atype string
ктоwheregroup
SQlite0.779 (+41%)9.532 (+55%)
Postgres14.698 (+368%) o_O1.469 (+7%)

 

Выводы

Да, всё грубо, приближенно, можно натюнить на совсем другие числа, но.

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

Если речь идёт о какой-то таблице, в которой редко работают с одной записью, но чаще сразу со всей группой перечисления, то вам лучше не использовать SQLite :). А если записей немного (в пределах миллиона), то можно и строки, чёрт с вами.

Я за числа везде и всегда. SQL, как и XML — не для людей. :)