Я создаю таблицу, и это заставило меня задуматься.
Если я сохраню, скажем, автомобили, у которых есть марка (например, BMW, Audi и т. Д.), Будет ли это иметь значение для скорости запроса, если я сохраню марку как int или varchar.
Так это
SELECT * FROM table WHERE make = 5 AND ...;
Быстрее / медленнее, чем
SELECT * FROM table WHERE make = 'audi' AND ...;
или скорость будет примерно такой же?
sql
performance
postgresql
select
googletorp
источник
источник
Некоторые приблизительные тесты:
4 миллиона записей в Postgres 9.x
Результаты на 8GB RAM, i7, SSD ноутбук:
поэтому похоже, что для этой настройки, пока ваши индексы помещаются в ОЗУ, bigint против текста с 16 символами не имеет значения в скорости.
источник
Это будет немного быстрее, используя int вместо varchar. Более важным для скорости является наличие индекса в поле, которое запрос может использовать для поиска записей.
Есть еще одна причина использовать int, и это для нормализации базы данных. Вместо того чтобы хранить в таблице тысячи раз текст Mercedes-Benz, вы должны сохранить его идентификатор, а название бренда - один раз в отдельной таблице.
источник
Mercedes-Benz
чтобы хранить тысячи раз id1
. Например таблицаcar_brands
, столбцыBrands
иId
. РядMercedes-Benz
и1
. И в главном столбце таблицыBrands
и значение1
. А когдаSELECT
, то сначалаId
из таблицы,car_brands
а потомSELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)
. Или какой-то другой подход?select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
.Если говорить о фактической производительности сравнения строк с не-числами с плавающей запятой, то в этом случае любой размер без знака и со знаком не имеет значения. На самом деле размер - это настоящая разница в производительности. Будь то 1 байт + (до 126 байт) по сравнению с 1,2,4 или 8-байтовым сравнением ... очевидно, что non-float меньше, чем строки и float, и, следовательно, более удобны для процессора при сборке.
Сравнение строки со строкой на всех языках происходит медленнее, чем то, что ЦП может сравнить в 1 инструкции. Даже сравнение 8-байтового (64-битного) на 32-битном процессоре все равно быстрее, чем VARCHAR (2) или больше. * Опять же, посмотрите на созданную сборку (даже вручную). Для сравнения char по char требуется больше инструкций, чем от 1 до 8 байтов CPU numeric.
Насколько быстрее? зависит также от объема данных. Если вы просто сравниваете 5 с «audi» - а это все, что есть в вашей БД, результирующая разница настолько минимальна, что вы никогда ее не увидите. В зависимости от ЦП, реализации (клиент / сервер, веб / скрипт и т. Д.) Вы, вероятно, не увидите его, пока не проведете несколько сотен сравнений на сервере БД (возможно, даже пару тысяч сравнений, прежде чем это станет заметным).
Ozz
источник
Индексирование или нет, int намного быстрее (чем длиннее varchar, тем медленнее он становится).
Другая причина: индекс в поле varchar будет намного больше, чем в int. Для больших таблиц это может означать сотни мегабайт (и тысячи страниц). Это значительно ухудшает производительность, поскольку для чтения одного индекса требуется много операций чтения с диска.
источник
В общем, int будет быстрее. Чем длиннее варчар, тем медленнее он работает
источник
Подсказка: Если возможные значения для поля макияжа будут никогда (или редко) изменения, вы можете использовать ENUM в качестве компромисса. Он сочетает в себе хорошую скорость с хорошей читабельностью.
источник
enum
тип данных? Я думал, что это было конкретно для MySQL.Если вы включите индексирование по любому из полей, оно будет быстрее. Что касается вашего вопроса, я думаю, что
int
быстрее, чемvarchar
.источник
В некоторой степени относительный. Да, INT будет быстрее, но вопрос в том, заметно ли это в вашей ситуации. VARCHAR - это просто небольшие слова или более длинные тексты? а сколько строк в таблице? Если есть всего несколько строк, они, скорее всего, будут полностью буферизованы в памяти (при частом запросе), в этом случае вы не заметите большой разницы. Затем, конечно, есть индексация, которая становится более важной, когда таблица растет. Использование SSD может быть быстрее, чем HD с оптимизированными запросами. Также хорошие дисковые контроллеры иногда ускоряют запросы более чем в 10 раз. Это может оставить место для простого использования VARCHAR, что упрощает чтение и запись запросов (нет необходимости писать сложные объединения) и ускоряет разработку. Однако пуристы не согласятся и всегда все нормализуют.
источник