пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ. пїЅпїЅпїЅпїЅ
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В начале пути веб-разработки вы, скорее всего, часто будете слышать такие понятия, как аутентификация (authentication) и авторизация (authorization). И здесь не сильно помогает тот факт, что они оба обычно сокращаются до «auth», и их легко перепутать.  Из этой статьи вы узнаете: о различиях между аутентификацией и авторизацией о том, как работают эти процессы примеры авторизации и аутентификации из реальной повседневной жизни Итак, давайте начнем! Что такое аутентификация? Аутентификация – это процесс проверки учетных данных, которые предоставляет пользователь, с теми, что хранятся в системе, с целью подтверждения того факта, что пользователь является тем, за кого себя выдает. Если учетные данные совпадают, вы предоставляете пользователю доступ, если нет – то доступ для пользователя запрещается.  Методы аутентификации Однофакторная аутентификация Такой метод аутентификация обычно используется в системах с низким уровнем риска. Для этого метода требуется всего один фактор; чаще всего это пароль. Именно поэтому системы с однофакторной аутентификацией наиболее уязвимы для фишинговых атак и клавиатурных шпионов.  Плюс ко всему, в недавно опубликованной сайтом DataProt статье было продемонстрировано, что 78% представителей поколения Z используют один и тот же пароль для нескольких сервисов. А это значит, что, если злоумышленник получит доступ к одной учетной записи пользователя, то с большей долей вероятности он получит доступ и к другим с помощью того же пароля.  Двухфакторная аутентификация Метод двухфакторной аутентификации является более безопасным, поскольку он включает в себя два фактора; обычно это то, что вы знаете, например, имя пользователя и пароль, и что-то, что у вас есть или чем вы владеете, например, SMS, отправленное на ваш телефон, или маркер доступа.  Для двухфакторной аутентификации вам потребуется ввести одноразовый пароль, который был отправлен в SMS-сообщении на ваш телефон, или, возможно, код привязанного приложения-аутентификатора и предоставить код доступа, который постоянно меняется.  Как вы уже могли понять, это намного безопаснее, чем просто ввести пароль или учетные данные для аутентификации. Для того, чтобы получить доступ, вам необходимо будет не только знать учетные данные для входа в систему, но и иметь доступ к физическому устройству.  За последние несколько лет двухфакторная аутентификация стала достаточно распространенной среди различных онлайн-сервисов, а многие крупные компании используют этот метод в качестве стандартного метода аутентификации. В некоторых случаях обязательным требованием использования сервиса является настройка двухфакторной аутентификации.  Многофакторная аутентификация Если вы хотите пойти дальше и сделать процесс аутентификации еще более безопасным, то можете использовать три и более факторов. Такой формат аутентификации, как правило, работает по следующей схеме: то, что вы знаете (имя пользователя + пароль или имя пользователя + пароль + контрольный вопрос и ответ) то, что у вас есть (SMS, отправленное на ваш телефон, приложение-аутентификатор, USB-ключ) то, чем вы являетесь (отпечаток пальца, распознавание лица) Именно поэтому многофакторная аутентификация обеспечивает наибольшую защиту, поскольку для получения доступа необходимо предоставить несколько факторов, а их не так просто «взломать» или воспроизвести.  Есть у этого метода один недостаток, он же причина, по которой многофакторная аутентификация не используется в среднестатистических системах – этот метод может оказаться слишком трудным в настройке и обслуживании. И поэтому данные или система, которую вы защищаете таким образом, должны полностью оправдывать необходимость использования такой системы безопасности.  Итак, а сколько информации необходимо для аутентификации? Этот вопрос часто поднимается на многих совещаниях по архитектуре безопасности. И ответ на него следующий: «это зависит от…».  Компании часто совмещают несколько различных методов аутентификации в зависимости от специфики приложения для того, чтобы повысить уровень безопасности.  Возьмем, к примеру, банковское приложение. Оно содержит конфиденциальную информацию, и если она попадет не в те руки, то банку это грозит последствиями, которые отразятся на финансовой части и на репутации банка. Банк может совмещать вопросы личного характера, на которые пользователю необходимо ответить, с номером клиента и надежным паролем.  В случае с социальными сетями вам могут потребоваться лишь имя пользователя и пароль, которые проверяются и подтверждаются, после чего пользователю разрешается доступ. Все упирается в уровень риска и в то, кто к какой информации может получить доступ, находясь в приложении. Это позволяет определить уровень аутентификации, который вам нужен. Если вы или ваша команда неверно оцените, а именно недооцените, необходимый для вашего приложения уровень аутентификации, то вас могут привлечь к ответственности за недостаточную защиту данных в вашей системе. Именно поэтому компании нанимают специалистов по безопасности, чтобы они проконсультировали их по передовым методам и нашли подходящие решение.  Как работает аутентификация в реальной жизни? Для примера возьмем аккаунт в социальной сети. Вы выбираете социальную сеть (сайт размещен на сервере), которую вы больше предпочитаете. Сервер потребует предоставить учетные данные для доступа к сайту через страницу входа в систему. Здесь вы должны ввести свое имя пользователя и пароль, которые были использованы для создания учетной записи.  Иллюстрация процесса аутентификации После чего эти данные отправляются на сервер, и начинается процесс аутентификации. Данные, которые вы предоставили, проверяются в базе данных сервера, и в случае, если они совпадают с данными в записи, вы проходите процесс аутентификации. Затем вам предоставляется форма данных, подтверждающих личность, например, cookie-файл или веб-токен JSON (JWT – JSON Web Token).  Отлично! Вы получили доступ к сайту и вошли в учетную запись.  Теперь рассмотрим процесс авторизации. Что такое авторизация? Авторизация – это процесс проверки того, что вам разрешен доступ к определенной области приложения или что вы можете выполнять определенные действия на основании определенных критериев или условий, которые были установлены приложением. Также этот процесс называют «управлением доступом» или «управлением привилегиями».  Авторизация может как предоставить право на выполнение неких задач или на доступ к определенным областям приложения, так и не дать его.  Давайте рассмотрим на примере: Мы уже получили доступ к социальной сети, но то, что мы можем там делать, зависит от того, какие у нас есть полномочия.  Если мы попробуем получить доступ к чьему-либо профилю, с которым мы не «дружим» (владелец профиля не принял запрос на «дружбу»), то мы не сможем просмотреть его – у нас не будет на это права. Это значит, что нам отказано в доступе к публикациям, которые сделал владельц этого профиля.  Процесс авторизации Как реализовать авторизацию В зависимости от фреймворков, которые вы используете, есть большое количество способов, как можно реализовать авторизацию.  Например, на платформе .NET вы можете использовать ролевое управление доступом или управление доступом на основе утверждений.  Ролевое управление доступом в своей основе имеет идеологию, которая подразумевает, что каждому пользователю в вашей системе назначается какая-то определенная роль. Эти роли имеют заранее определенные права доступа для каждого пользователя. Пользователь, которому была предоставлена та или иная роль, автоматически получает эти права доступа. Роли назначаются в процессе создания и настройки пользователя.  Затем, когда пользователь попытается получить доступ, например, к области администрирования, конечная точка или сайт просто проверят, имеет ли текущий пользователь роль администратора.  Недостаток данного подхода заключается в том, что иногда пользователям предоставляются слишком много прав доступа, некоторые из которых им не нужны или не должны были быть им предоставлены.  Например, если пользователю предоставили роль администратора (Admin), то это значит, что у него есть право доступа пользователя на комплексное создание (Advanced Create), редактирование (Edit), удаление (Delete) и просмотр (View). В то время как вы можете предоставить им право только на просмотр (View) и первичное создание (Basic Create).  Управление доступом на основе утверждений позволяет выполнить более точную настройку прав доступа конкретного пользователя. Приложение может проверить, закреплено ли за пользователем утверждение или присвоено ли утверждению конкретное значение. Например, пользователю может быть передано утверждение CreateUser; оно проверяется при создании пользователя. Или вы можете присвоить тому же утверждению значение Advanced, а затем получить доступ к различным действиям и пользовательскому интерфейсу в зависимости от того, присвоили вы значение Advanced или Basic. В чем разница между аутентификацией и авторизацией? Итак, теперь, когда мы рассмотрели оба термина и разобрались в том, что они означают, давайте взглянем на сценарий, с которым, я думаю, многие знакомы и который включает в себя оба процесса.  На званом ужине с особым списком гостей каждому гостю присваивается имя и секретный пароль.  По прибытии сотрудник охраны спрашивает у вас ваше имя и секретный пароль. Далее они аутентифицируют ваши учетные данные по списку, который у них имеется. Если ваши учетные данные совпадают, то вам вручают конверт, который показывает, что вас допустили. Оказавшись внутри, у вас есть право получить доступ к званому ужину и общим зонам заведения, поскольку для них авторизация не требуется (у всех есть право быть допущенным до званого ужина). Однако после вы захотите посетить VIP-зону.  Когда вы подходите к ней, то другой сотрудник охраны просит открыть конверт, который вам вручили (в нем описаны ваши права доступа и роли). Он смотрит, но, к сожалению, у вас нет роли VIP, и поэтому вы не можете быть авторизованы. Если простыми словами, то аутентификация проверяет личность пользователя или службы, разрешающей доступ, а авторизация определяет, что они могут делать, после того, как окажутся внутри.  Почему следует реализовать как аутентификацию, так и авторизацию? Как вы могли заметить, несмотря на то, что аутентификация и авторизация сами по себе очень разные, каждый из этих процессов играет свою неотъемлемую роль в обеспечении безопасности и целостности приложения или системы.  Эти процессы действуют заодно, и один без другого не имеет смысла. Если вы можете получить доступ к области администрирования и при этом делать там все, что вам вздумается, то это может привести к серьезным проблемам.  А с другой стороны, вы не сможете авторизовать людей, не зная, кто они! Именно поэтому аутентификация всегда идет до авторизации.  Заключение Я надеюсь, что данная статья оказалась полезной, и теперь вы знаете, чем авторизация отличается от аутентификации и как их использовать.  И запомните: Аутентификация = проверяет личность пользователя или процесса Авторизация = определяет, есть ли у пользователя/системы права доступа на использование какого-либо ресурса или выполнения какого-либо действия. 
img
  Введение Загрузчик – это неотъемлемый элемент операционный системы, который помогает выполнять инициализацию аппаратного обеспечения и установку компонентов программного обеспечения, необходимых для успешной загрузки. Если на компьютере установлено несколько операционных систем, то у загрузчика должен быть пользовательский интерфейс, через который можно выбрать, какую операционную систему необходимо загрузить.  В этой статье мы расскажем, что такое загрузчик GRUB, а также рассмотрим его характерные особенности и роль в системе Linux. Что такое GRUB? GRUB (также известный как GNU GRUB или GNU Grand Unified Bootloader) – это загрузчик и диспетчер загрузки для Linux и других операционных систем на базе Unix. GRUB запускается уже после того, как BIOS завершит все необходимые проверки аппаратных средств и загрузит его из главной загрузочной записи (MBR - Master Boot Record). После чего GRUB получает контроль над системой и загружает ядро Linux. На сегодняшний день существует две версии GRUB для Linux: GRUB Legacy (GRUB 1). Это устаревшая версия GRUB, которая по-прежнему встречается в некоторых старых дистрибутивах Linux. GRUB 2. Это версия GRUB, которая поддерживает новые архитектуры ПК (например, ARM) и файловые системы (например, ReiserFS), RAID-массивы и программу управления логическими томами (LVM - Logical Volume Manager). Большинство современных дистрибутивов используют именно эту версию. Ниже продемонстрирован пример меню GRUB, найденный в Linux Mint: Загрузчик и диспетчер загрузки: в чем разница? GRUB выполняет две функции: загрузчика и диспетчера загрузки. Во время запуска системы эти два компонента отвечают за разные задачи.  Загрузчик загружает ядро системы с запоминающего устройства (жесткого диска или SDD) в оперативную память. Кроме того, загрузчики отвечают за инициализацию аппаратного обеспечения, а также установку памяти и настройку ЦП. Диспетчер загрузки предоставляет пользователю интерфейс, где он может управлять процессом загрузки и выбирать, какую систему загружать. В качестве интерфейса может выступать стандартное меню GRUB или настроенное под конкретный дистрибутив, например, Kali Linux: Что делает GRUB? После того, как BIOS загрузил GRUB в память, GRUB предоставляет пользователю меню с параметрами загрузки. Под этими параметрами подразумеваются установленные операционные системы и специальные параметры загрузки, такие как безопасный режим. Как только пользователь указал все необходимые параметры или время, отведенное на это, истекло, GRUB приступает к загрузке соответствующего ядра. Для того, чтобы этот процесс был выполнен успешно, GRUB учитывает такие параметры, как: BOOT_IMAGE . Это параметр, указывающий на расположение ядра Linux. initrd (initial ramdisk). Схема, демонстрирующая, как можно загрузить временную корневую файловую систему в оперативную память. root . Расположение корневой файловой системы. quiet . Параметр конфигурации, который позволяет скрыть системный вывод, появляющийся в процессе загрузки. ro . Параметр, который указывает на то, что файловая система должна быть смонтирована таким образом, чтобы она была доступна только для чтения. Это необходимо для работы программ проверки целостности файловых систем.  splash . Экран-заставка, который отображается во время загрузки операционной системы. Процесс загрузки GRUB Процесс загрузки GRUB состоит из двух или трех этапов: Этап 1. Первый этап начинается сразу после того, как BIOS загрузил GRUB из MBR. Для запуска следующего более сложного этапа GRUB использует небольшое пространство в MBR, выделенное под код инициализации. Этап 1.5. Это необязательный этап, который позволяет произвести динамическое чтение файла на этапе 2. GRUB поддерживает несколько файловых систем и устанавливает ту, которая соответствует той, где находится файл этапа 2. Если в процессе установки GRUB этап 1.5 игнорируется, этап 2 выполняется статически. Этап 2. Заключительный этап загрузки GRUB – самый длинный и самый сложный. Здесь выполняются все шаги, которые необходимы для запуска системы, в частности, Отображение меню загрузки Загрузка ядра операционной системы Инициализация ядра Инициализация пользовательского пространства Характерные особенности GRUB GRUB – это универсальный и надежный загрузчик, который был разработан с учетом требований современных операционных систем. Ниже приведен список характерных особенностей GRUB: Модульная архитектура . Модульная архитектура GRUB обходит ограничения BIOS, за счет чего он может предложить больше функциональных возможностей. Гибкая конфигурация . Путем редактирования файла конфигурации GRUB пользователи могут настраивать различные аспекты своей системы, например, запись загрузки по умолчанию, параметры ядра и время ожидания. Поддержка мультизагрузки . У GRUB есть меню загрузки, где пользователь может выбрать, какую операционную систему (из установленных) запустить. Динамическое обнаружение . GRUB динамически обнаруживает установленные операционные системы и генерирует соответствующие записи загрузки. Цепочная загрузка . GRUB может взаимодействовать с другими загрузчиками, например, Windows Boot Manager или NTLDR. Поддержка файловых систем . GRUB поддерживает различные файловый системы (например, ext2, ext3, ext4, Btrfs, HFS+, NTFS, FAT и ReiserFS), что делает его безопасным вариантом для запуска любой операционной системы на базе Unix. Язык описания сценариев . Пользователи, которым необходимо создавать свои собственные конфигурации загрузки или которым необходима автоматизация, могут использовать язык описания сценариев GRUB. Защита паролем . Предлагая установить пароль для меню загрузчика, GRUB повышает надежность системы. Режим восстановления . Этот режим помогает пользователям устранять различные неполадки и проблемы, связанные с загрузкой. Поддержка устаревших   BIOS и UEFI . GRUB работает как с обычным BIOS, так и с современной прошивкой UEFI. Загрузка по сети. GRUB поддерживает PXE-загрузку, позволяя компьютерам в сети загружаться через сервер.  Как получить доступ к GRUB и изменить его? Отредактировав файл конфигурации GRUB, можно изменить его конфигурацию и настроить под себя его интерфейс. Настройка GRUB выполняется через терминал вашей системы и требует прав администратора.  Редактирование файла конфигурации GRUB Примечание : ошибки в конфигурации GRUB могут помешать загрузке системы. Прежде чем приступать к редактированию файла конфигурации, убедитесь, что вы сделали резервную копию системы. Чтобы приступить к настройке GRUB: 1. Откройте файл конфигурации в текстовом редакторе, например, Nano: sudo nano /etc/default/grub В этом файле содержатся параметры, которые управляют поведением GRUB. Ниже приведены несколько параметров, которые редактируют чаще всего: GRUB_DEFAULT . Устанавливает числовой индекс или заголовок пункта меню в качестве записи загрузки по умолчанию. GRUB_TIMEOUT . Определяет количество секунд, в течение которых GRUB отображает меню загрузки, прежде чем выполнить загрузку по умолчанию. GRUB_HIDDEN_TIMEOUT . Скрывает или показывает меню GRUB. GRUB_CMDLINE_LINUX . Определяет параметры командной строки ядра. GRUB_DISABLE_OS_PROBER . Отключает динамическое обнаружение операционных систем. 2. Внеся все необходимые изменения в файл, сохраните его и выйдите из редактора. Далее, чтобы применить изменения, введите следующую команду в терминале: sudo update-grub Эта команда сканирует изменения в  /etc/default/grub и применяет их к  grub.cfg (файлу, который GRUB использует в процессе загрузки). 3. Чтобы изменения вступили в силу, перезагрузите компьютер.  Редактирование интерфейса GRUB С помощью файла конфигурации также можно изменить то, как будет выглядеть GRUB в вашей системе. Чтобы настроить GRUB под себя, выполните следующие действия: 1. Откройте файл конфигурации в текстовом редакторе: sudo nano /etc/default/grub 2. Найдите параметры, который определяют внешний вид диспетчера загрузки GRUB: GRUB_BACKGROUND . Это параметр, с помощью которого можно установить свое собственное фоновое изображение. Для этого вам понадобиться следующий синтаксис: GRUB_BACKGROUND="[path-to-the-image]/[filename].jpg" GRUB_THEME . Если ваш дистрибутив поддерживает темы GRUB, укажите здесь путь к файлу темы.  Сохраните файл и выйдите.  4. Обновите GRUB: sudo update-grub Все изменения отобразятся при следующем запуске.  GRUB Customizer GRUB Customizer – это инструмент с графическим интерфейсом, предназначенный для изменения внешнего вида GRUB. Он избавляет вас от необходимости редактировать файл конфигурации вручную. Чтобы установить его через терминал, выполните следующие действия: 1. Добавьте репозиторий GRUB Customizer: sudo add-apt-repository ppa:danielrichter2007/grub-customizer Нажмите  Enter , чтобы подтвердить добавление репозитория, и дождитесь завершения процесса.  2. Обновите информацию о репозитории sudo apt update 3. Установите GRUB Customizer: sudo apt install grub-customizer Введите  Y и нажмите  Enter , чтобы начать установку.  4. Запустите программу, введя следующее: grub-customizer Появится окно графического интерфейса GRUB Customizer. Ниже представлены несколько важных особенностей GRUB Customizer: Простой графический интерфейс, с помощью которого можно изменять порядок записей загрузки в меню загрузки и устанавливать записи загрузки по умолчанию. Параметры персонализации, с помощью которых можно изменять фоновое изображение и общий вид меню GRUB. Параметры, с помощью которых можно настроить время ожидания.  Графический способ изменения параметров ядра и переменных среды GRUB. Варианты установки GRUB в определённый раздел или устройство. Заключение Прочитав эту статью, вы должны были больше узнать о том, что такое GRUB, о его особенностях и о том, как его можно настроить под себя. В этой статье мы также познакомились с GRUB Customizer – инструментом с графическим интерфейсом для редактирования конфигурации GRUB. 
img
  Один из самых простых способов повысить общую производительность базы данных, а если конкретнее, производительность запросов, это использовать индексы баз данных. Но здесь главное – выбрать правильный тип индекса. Каждый индекс в SQL имеет свои собственные преимущества, и поэтому важно знать, когда и какой индекс использовать. Здесь мы рассмотрим самые распространенные индексы из самых популярных реляционных СУБД (СУБД - система управления базами данных) и выясним, когда их нужно использовать.  Что такое индексы баз данных? Индекс базы данных – это дополнительная структура данных, которая создается наряду с данными в таблице. Вы определяете индекс для таблицы и столбца (или набора столбцов). Таким образом вы создаете новую структуру поиска данных, которая непосредственно связана с этой таблицей и набором столбцов.  В этой статье мы подробно распишем, что такое индекс, как его можно создать, какие есть типы индексов и когда их нужно использовать.  Для чего нужны индексы? Индексы баз данных ускоряют процесс извлечения данных, и тем самым повышают производительность запросов. Это и есть главная задача таких индексов. Все это происходит за счет того, что для хранения b-дерева и указателей на фактические данные выделяется дополнительная память.  Индексы используются для того, чтобы при каждом запросе строки из таблицы у базы данных не было необходимости просматривать все строки. В общем-то, индексы обеспечивают довольно эффективный способ обращения к упорядоченным записям.  Как можно создать индекс? У разных РСУБД разный синтаксис для создания индекса. Помимо этого, разные механизмы СУБД используют для этого разные параметры. Это мы с вами сможем увидеть чуть позже. И тем не менее, все же существует общий синтаксис создания самого примитивного индекса, который подходит для всех механизмов СУБД. Ниже приведена синтаксическая структура, с помощью которой можно создать в таблице самый примитивный индекс.  CREATE INDEX index_name ON table_name (column_name_1, column_name_2, …) А сейчас давайте воспользуемся этой структурой, чтобы создать индекс для реальной таблицы. Допустим, у нас есть таблица Customer (см. ниже), и мы хотим создать индекс для того, чтобы ускорить процесс поиска по имени клиента.  CREATE INDEX IX_CustomerName ON Customer (FirstName, LastName) После того, как мы запустим этот код, мы получим индекс для таблицы  Customer под названием  IX_CustomerName . За счет этого индекса поиск данных в столбцах  FirstName и  LastName будет проходить куда быстрее.  Индекс, который создается, что называется, за кадром, еще называют некластеризованным индексом или индексом бинарного поиска. С помощью этого индекса мы можем выполнять оптимизированные запросы для сценариев, где присутствуют такие запросы, как: SELECT FirstName, LastName, Email FROM Customer WHERE FirstName = ‘Mark’ and LastName = ‘Thompson’ Как показывает опыт, каждый раз, когда мы хотим оптимизировать запрос, мы смотрим на столбцы, которые используются для выборки данных, и проверяем, есть ли у нас для них индекс. В случае, если столбцы в предложении SELECT аналогичны столбцам в предложениях для выборки данных, у нас появляется оптимизированный план действий, и, соответственно, поиск проходит быстрее.  Но это не то, что нам нужно. Индексирование – это гораздо большее, чем просто эти правила.  Какие бывают индексы в SQL? Раз уж мы разобрались, как создавать индекс, теперь давайте обсудим основные типы индексов реляционных баз данных, с помощью которых вы сможете оптимизировать свои запросы. Для некоторых из них нужен определенный механизм СУБД, поэтому мы укажем, где их можно использовать.  Все индексы хранят указатели на строки данных в структуре данных под названием дерево поиска. Эта структура оптимизирована для поиска, и она же является главной опорой для индекса. С ее помощью мы можем выполнять что-то наподобие поиска в двоичном дереве поиска, но в нашем случае все немного сложнее.  Есть много различных индексов. У каждого из них своя внутренняя структура данных, а, соответственно, и назначение. Дальше мы рассмотрим их более подробно, а здесь пока кратко оговорим их названия.  С точки зрения характеристик атрибута: Первичный индекс Кластеризованный индекс Вторичный индекс С точки зрения количества ссылок на файл данных: Плотный индекс Разреженный индекс Нестандартные индексы для очень специфичных сценариев: Битовый индекс Реверсивный индекс Хэш-индекс Отфильтрованный индекс Индекс по функции Пространственный индекс Давайте для примера воспользуемся той же таблицей   Customer , что мы использовали ранее. Для того, чтобы понять, как выглядят выборочные данные, давайте напишем простой запрос  SELECT и вернем из таблицы все данные.  Кластеризованный индекс Кластеризованный (или кластеризующий) индекс – это один из самых распространенных индексов, которые можно использовать во всех современных полнофункциональных СУБД. Этот индекс определяет порядок, в котором данные хранятся на странице (физически) и в таблице (неявно).  Давайте посмотрим на пример. Допустим, что первые две строки находятся на Странице №1, третья и четвертая строки – на Странице №2, а последняя пятая строка – на Странице №3 (см. ниже). Задача кластеризованного индекса – физически хранить строки в порядке возрастания или убывания, беря в качестве основы столбец, который был выбран. Этот индекс нужен для того, чтобы хранить именно отсортированные данные. Это значительно упрощает поиск одного или нескольких значений в каком-нибудь диапазоне. Правда, кластеризованный индекс может помочь нам только в том случае, если мы ищем значения в каком-то диапазоне, а не среди всех данных.  Допустим, что список клиентов на нашей информационной панели всегда отображается по алфавиту. Так вот, мы хотим, чтобы наши данные хранились в нашей базе данных в отсортированном порядке по именам и фамилиям. И для того, чтобы создать кластеризованный индекс, мы пишем следующий запрос: CREATE CLUSTERED INDEX CI_FirstName_LastName ON Customer (FirstName ASC, LastName ASC); Этот запрос сказывается на предыдущем, с помощью которого мы вернули все данные. Когда мы создали кластеризованный индекс с сортировкой по возрастанию по имени и фамилии, то мы физически переупорядочили данные на страницах. Если мы с вами взглянем на наши страницы, то увидим, что теперь они выглядят иначе: Как мы видим, теперь данные отсортированы по имени, а потом по фамилии. Это может существенно упростить нам жизнь и улучшить производительность, так как, если мы сделаем запрос на сортировку строк по алфавиту, ничего не произойдет, поскольку строки и так хранятся в отсортированном порядке. Таким образом, мы можем обойтись без сортировки в самом запросе.  Если мы захотим получить данные о первых 10 клиентах с точки зрения алфавитного порядка, то база данных не будет искать их по всей таблице. Она просто вернет страницы с первыми 10 записями, так как они уже отсортированы. Битовый индекс Битовый индекс – это еще одна разновидность индексов. На момент написания статьи его можно было использовать только в Oracle. Этот индекс особо полезен в одном конкретном сценарии, когда вы хотите запросить и отфильтровать по столбцу какую-то часть таблицы, которая в сравнении со всей таблицей не такая уж большая. Давайте вернемся к нашему примеру и попробуем применить этот битовый индекс. Представьте, что в нашей таблице  Customer   на самом деле не 5, а более 10 миллионов строк. И, допустим, мы хотим отфильтровать наш запрос, в результате которого мы получим данные о клиентах женского пола с фамилией Watson. Мы можем написать запрос примерно вот так: SELECT FirstName, LastName, Email FROM Customer WHERE Gender = 2 AND LastNamr = “Watson”; Битовый индекс идеально подходит для этой ситуации, так как в сравнении с 10 миллионами записями строк, которые соответствуют какому-то определенному полу, гораздо меньше. Теперь ускорим наш запрос, создав битовый индекс: CREATE BIMAP INDEX BMP_Gender ON Customer (Gender) А теперь мы выбираем «Kate Watson» и ее адрес электронной почты (см. ниже), а также все остальные подходящие строки из 10 миллионов в этой таблице.  Битовый индекс может оказаться еще более мощным, если вы создадите его в предложении  JOIN . Например, если мы соединим две таблицы:   Customer и  Sales , и отфильтруем их по полу. В этом случае битовый индекс будет выглядеть примерно так: CREATE BITMAP INDEX BMP_Gender_Sales ON Customer (Gender) FROM Customer, Sales WHERE Customer.ID = Sales.Customer_ID; Каждый раз, когда вы будете отправлять запрос на объединение этих двух таблиц и их фильтрации по полу, вы будете очень близки к максимальной производительности запроса.  Реверсивный индекс Реверсивный индекс во многом похож на обычный индекс. Но он не создает двоичное дерево поиска для того, чтобы ускорить поиск данных в порядке возрастания, этот индекс оптимизирован для поиска данных в порядке убывания. Синтаксическая конструкция для создания реверсивного индекса очень похожа на синтаксическую конструкцию обычного некластеризованного индекса. Разница лишь в том, что мы должны указать, что данные должны быть в обратном (убывающем) порядке.  Предположим, что мы хотим оптимизировать запрос, с помощью которого хотим узнать имена клиентов, которые разместили 3 последних заказа. Создадим индекс: CREATE INDEX IX_LastOrder_Customer ON Customer (LastOrder DESC); Самое важное слово в этой конструкции – это  DESC . Оно сообщает механизму СУБД, что необходимо создать именно реверсивный индекс. Таким образом, каждый раз, когда мы будем запрашивать данные о трех последних заказах из таблицы  Customer , мы будем получать наилучшую производительность запроса.  Какую структуру данных использует индекс? Как мы уже упоминали, индексы создаются наряду с другими структурами данных для оптимизации операций поиска. Но что это за структуры данных? Сбалансированное дерево Самые распространенные индексы для того, чтобы ускорить запросы, используют, так сказать, за кадром сбалансированное дерево. Большинство механизмов СУБД используют либо сбалансированное дерево, либо его разновидность, например, b+-дерево. Ниже показано как выглядит структура обычного сбалансированного дерева.  Верхний узел – это корневой, а все остальные, которые расположены ниже, - это либо дочерние, либо конечные узлы. Поиск строки начинается с корневого узла. Мы сравниваем искомое значение со значением в текущем узле, больше оно или меньше. В зависимости от результата этого сравнения мы поймем, в какую сторону нам нужно идти, влево или вправо. Если мы посмотрим на пример выше, то увидим, что все значения меньше 8 ведут нас влево, а значения больше 8 – вправо, и т.д.  Хэш Хэш используется хэш-индексами. Это структура данных, которая обеспечивает один из самых быстрых поисков. С помощью хэша индексы могут очень быстро находить данные, которые хранятся в таблице.  Основная идея хэша состоит в следующем: вместо того, чтобы перебирать все ключи поиска с помощью индексов или искать их по всей таблице, мы применяем к нему хэш-функцию. Этот ключ поиска преобразуется в хэш-значение, которое определяет соответствующе, так называемое, «ведро». Давайте посмотрим на пример ниже. В нем мы применяем хэш-функцию к ключу поиска «Mike», после чего оно ставит в соответствие определенное ведро.  Каждое такое ведро в массиве ведер содержит одинаковое количество записей. Неважно, сколько в столбце различных значений, каждая строка сопоставляется с отдельным ведром. После чего выбирается соответствующая строка и возвращается из этого ведра.    Реализация индексов с помощью механизмов РСУБД Как вы уже могли понять, в реляционной базе данных есть несколько типов индексов. И у каждого механизма СУБД есть свои собственные реализации этих индексов. Давайте пройдемся по самым популярным механизмам СУБД, перечислим индексы, которые у них есть и обсудим, когда их лучше использовать.  Индексы в PostgreSQL У PostgreSQL список индексов довольно большой. Каждый из них подходит для конкретных сценариев: Самый распространенный индекс – индекс В-дерева. Он будет полезен в ситуациях, когда вам нужно сравнивать диапазоны в столбцах, которые можно сортировать.  Хэш-индекс хранит 32-битный хэш-код, который является производным от значений индексированных столбцов. Он будет полезен в тех случаях, когда вам нужно проводить простые сравнения.  GiST – это не один какой-то индекс, а скорее логическая структура, в которой могут быть реализованы несколько разных стратегий индексирования. Чаще всего эта структура используется в сценариях, в рамках которых вам нужно найти «ближайшего соседа» в геометрических типах данных. SP-GiST, как и GiST, реализует несколько стратегий индексирования. В его основе лежат различные структуры данных, такие как деревья квадрантов, k-мерные и базисные деревья. Этот индекс используется в тех же сценариях, что и GiST. GIN также называют «инвертированным индексом». Он используется в сценариях, в которых данные являются массивом. Инвертированный индекс содержит отдельную запись для каждого компонента массива.  BRIN расшифровывается как «Block Range INdex», что переводится как «блочно-диапазонный индекс». Он используется для хранения краткого описания значений на последовательных страницах физических данных внутри таблицы. Лучше всего он подходит для ситуаций, когда значения в строках перекликаются с физическим порядком страниц данных. Индексы в Oracle У Oracle список индексов чуть меньше. Но при этом они считаются более продуманными с точки зрения применимости. В-дерево – это стандартный индекс. Он также есть и в других механизмах СУБД. В-дерево лучше всего подходит для представления первичных ключей и столбцов, у которых огромное количество различных значений относительно общего числа строк.  Битовый индекс нужен для обратных сценариев. Например, его можно использовать в сценариях, где количество различных значений в столбце не так велико относительно общего числа строк. Индекс по функции – это индекс, в рамках которого значение, хранящееся в дереве поиска, определяется функцией. Таким образом он обеспечивает отличную производительность запросов, в которых есть предложения  WHERE с функциями внутри.   Индексы в SQL Server У SQL Server не так много индексов, но при этом у них очень много функциональных возможностей.  Кластеризованный индекс нужен не только для того, чтобы механизм СУБД мог выполнить поиск в запросе. Он физически реорганизовывает строки на страницах данных так, чтобы они были отсортированы либо по возрастанию, либо по убыванию.  Некластеризованный индекс – это эквивалент В-дерева, которое есть в других механизмах СУБД. В основном он хорошо подходит для ситуаций, когда нужно перебрать данные с огромным количеством различных значений.  Отфильтрованные индексы создаются для определенных групп данных. Они используются для того, чтобы оптимизировать поиск ассиметричных данных с заданными критериями.  Например, мы хотим найти в столбце число 55. Но оно есть лишь в нескольких строках (относительно общего числа строк в таблице). Тогда вы можете создать отфильтрованный индекс по принципу кластеризованного, просто дополнительно указав условие  WHERE column = 55 .  Индексы в MySQL В MySQL тоже есть несколько индексов, с помощью которых можно повысить производительность запросов.  Индекс первичного ключа – это уникальный индекс, с помощью которого можно быстро и эффективно обращаться к уникальным значениям. Также для него выгодной является оптимизация  NOT NULL , так как у него не может быть значения  NULL . Он всегда используется при определении первичного ключа и создается автоматически, когда вы указываете ключевые слова  PRIMARY KEY . Однозначный индекс во многом похож на индекс первичного ключа. Но он более гибкий в том смысле, что он позволяет многократно сохранять значения  NULL . Он используется для того, чтобы обеспечить дополнительную уникальность в том случае, когда первичный ключ уже был создан.  Расширьте свой инструментарий с помощью индексов баз данных Если вы дошли аж до сюда, то значит, вам понравилось читать про индексы баз данных! Я надеюсь, что эта информация была для вас полезной, и вы смогли найти здесь для себя что-то новое. Если вдруг ваши запросы начнут тормозить, то с помощью ваших знаний о том, какие есть индексы в различных механизмах СУБД, вы сможете повысить производительность запросов.  Иногда может быть так, что обычного В-дерева будет недостаточно, или он может не соответствовать схеме и/или данным. Поэтому иметь представление о том, какие еще есть типы индексов в реляционной базе данных, это все равно что иметь швейцарский армейский нож в своем ящике с инструментами. 
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59