Сравнение скорости баз данных с численными и строковыми перечислениями
Посыл
В мае сего года, Александр Кошелев написал как сделать перечисления в джанге. И большое ему за это спасибо. Но. Александр выступает за читабельную raw базу, а я против. Вот, что он пишет:
Потом, что будет если вы просмотрите raw базу? Увидите там кучу строк, где в поле “тип” какие-то не понятные числа
надо использовать строковые литералы для обозначения типа и сменить тип поля в модели на CharField. И пускай это чуть-чуть менее эффективно с точки зрения объема информации.
Уважаемый Александр! Насрать на размер базы! Не в этом дело.
О том, почему в базе должны храниться чиселки-айдишники вместо строк, там где это можно, низлежащий тест на скорость.
Тест на скорость
Для теста использовалась табличка примерно такой структуры:
имя | тип поля | индекс |
---|---|---|
id | int | PK |
name | varchar(100) | - |
pass | varchar(50) | - |
varchar(100) | - | |
atype | int и varchar(30) | index |
i1 | float | - |
Табличка заполнялась примерно 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;
кто | where | group |
---|---|---|
SQLite | 0.549 | 6.119 |
Postgres | 3.138 | 1.371 |
кто | where | group |
---|---|---|
SQlite | 0.779 (+41%) | 9.532 (+55%) |
Postgres | 14.698 (+368%) o_O | 1.469 (+7%) |
Выводы
Да, всё грубо, приближенно, можно натюнить на совсем другие числа, но.
Если мы говорим о типах юзеров, статусах заказов, совершенно точно быстрее будет численное перечисление.
Если речь идёт о какой-то таблице, в которой редко работают с одной записью, но чаще сразу со всей группой перечисления, то вам лучше не использовать SQLite :). А если записей немного (в пределах миллиона), то можно и строки, чёрт с вами.
Я за числа везде и всегда. SQL, как и XML — не для людей. :)