Я не специалист по базам данных, я веб-разработчик. И еще один Rails. Большинство моих взаимодействий с базой данных осуществляется через ActiveRecord или Sequel, а необработанный SQL, который я обычно пишу, в основном состоит из SELECT, JOIN и WHERE.
НО я работал с приложением на базе Microsoft SQL Server, что является интересным изменением. Задача привела к задаче, которая привела к задаче, и мне пришлось создать новый столбец с уникальным индексом в существующей таблице, где столбец не может иметь нулевое значение и где не нужно заполнять данные для 100K + записи. В основном я могу делать это в Rails. Я знаю базовый SQL. Я знаю столбцы, значения по умолчанию и NOT NULL. Но в основном я знал об индексах в Rails:
- Ускоряет поиск ??
- Делает пишет медленнее ??
- Есть ли что-то с перестановкой строк базы данных, чтобы увеличить масштаб?
В основном, я знал, что вы просто добавляете одну строчку к миграции, add_index: column_name, а затем Rails что-то делает, и БД увеличивается. Но не добавляйте его ко всему, потому что это не оптимизированная база данных ™.
Некоторый быстрый поиск в Google и некоторые эксперименты привели меня к тому, чтобы узнать, что на самом деле представляют собой кластерные и некластеризованные индексы и как это делать в SQL.
Кластерный индекс
- Определяет, в каком порядке записи хранятся в таблице
- Может быть только 1 на стол
- Обычно по первичному ключу
- Хочу на уникальных столбцах
- Самый быстрый поиск, самая медленная запись
Поиск строк по их кластеризованному индексу - самый быстрый шаг, потому что ваша база данных знает точное местоположение той строки, о которой вы говорите. Запись строки, которая «не соответствует порядку» кластеризованного индекса, выполняется медленно, потому что база данных должна переупорядочивать строки в таблице при записи. Помещение кластеризованного индекса в столбец, который не является уникальным, заставляет базу данных добавлять дополнительные «фоновые байты», чтобы определить, в каком порядке должны быть строки с одинаковым значением.
Некластерный индекс
- Может иметь много на таблицу
- Более медленный поиск, чем кластерный индекс, но быстрее, чем без индекса
- Все еще медленная запись, но быстрее, чем изменение порядка кластерного индекса
- Может быть на неуникальных столбцах
Некластеризованные индексы используют указатели для поиска строки данных с помощью «указателя строк». Это на один шаг больше, чем используется кластеризованным индексом, что делает его медленнее, чем кластеризованный индекс, но из-за метода указателя позволяет использовать несколько индексов. Некластеризованный индекс будет определять, как указывать на правильные строки при записи в базу данных, но на самом деле не нужно ничего переупорядочивать, что значительно ускоряет запись. По этой же причине нецелесообразно индексировать каждый столбец в таблице, потому что запись в него превращается в обычный процесс.
И наконец
- Можно сделать с фильтрами
Это была палочка-выручалочка. Используя некластеризованный индекс в SQL, вы можете создавать уникальные индексы, которые слушают предложения WHERE, что привело к решению…
CREATE UNIQUE NONCLUSTERED INDEX my_column ON MyTable(my_column) WHERE my_column <> '';
Так что мой новый столбец в таблице со 100 тыс. Строк будет однозначно проиндексирован в будущем, не беспокоясь о повторном заполнении сложного столбца.
Думаю, это довольно круто.