powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Какие стоит указать индексы?
19 сообщений из 19, страница 1 из 1
Какие стоит указать индексы?
    #39867220
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Уважаемые, вопрос ламерский, но я его всё же задам и для себя закрою навсегда.
Есть условная таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
Table TabA (
     id        SERIAL,
     fkObjID   BIGINT UNSIGNED NOT NULL,
     objName   CHAR(255) NOT NULL, 
     orderNum  TINYINT UNSIGNED NOT NULL,
     FK(fkObjID) => other_table(id)
)


И запросы к этой таблице будут очевидными:
Код: sql
1.
2.
3.
4.
SELECT aa.id, aa.objName 
FROM   TabA aa 
WHERE  aa.fkObjID=${OBJ_ID}
ORDER BY orderNum ASC


В такой ситуации надо ли в таблице определять такие индексы:
Код: sql
1.
2.
3.
4.
5.
6.
KEY fkIdx (fkObjID),
KEY ordIdx (orderNum)
или надо делать такой:
KEY objOrdIdx (fkObjID, orderNum)
или вообще надо определить уникальный (принципиально в задаче мне это не требуется, но и мешать уникальность не будет)
UNIQUE KEY objOrdIdx (fkObjID, orderNum)


Дайте пожалуйста дельный совет!
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867291
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotВ такой ситуации надо ли в таблице определять такие индексы

Обычно не надо. Но в зависимости от используемой СУБД и её оптимизатора могут быть нюансы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867337
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotДобрый день!

Уважаемые, вопрос ламерский, но я его всё же задам и для себя закрою навсегда.
Есть условная таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
Table TabA (
     id        SERIAL,
     fkObjID   BIGINT UNSIGNED NOT NULL,
     objName   CHAR(255) NOT NULL, 
     orderNum  TINYINT UNSIGNED NOT NULL,
     FK(fkObjID) => other_table(id)
)


И запросы к этой таблице будут очевидными:
Код: sql
1.
2.
3.
4.
SELECT aa.id, aa.objName 
FROM   TabA aa 
WHERE  aa.fkObjID=${OBJ_ID}
ORDER BY orderNum ASC


В такой ситуации надо ли в таблице определять такие индексы:
Код: sql
1.
2.
3.
4.
5.
6.
KEY fkIdx (fkObjID),
KEY ordIdx (orderNum)
или надо делать такой:
KEY objOrdIdx (fkObjID, orderNum)
или вообще надо определить уникальный (принципиально в задаче мне это не требуется, но и мешать уникальность не будет)
UNIQUE KEY objOrdIdx (fkObjID, orderNum)


Дайте пожалуйста дельный совет!

Формально, решение принимается на таких вещах как план запроса и представлении о селективности индексируемого поля.
(Например, для поля типа пол, обычные индексы могут только ухудшить. Лучше какой-нибудь bitmap. Но такой для оперативных БД вообще не очень подходит.
У Оракла, Фул скан считывает по несколько блоков за раз, а с индексом по одному.)


Но составной индекс для такого запроса выглядит как-то не очень. Составной напрашивался бы при условии
WHERE aa.fkObjID=….
AND orderNum =…

Т.е. по этому запросу без дополнительной информации только
KEY fkIdx (fkObjID),

И то при условии что мало строк получим при условии aa.fkObjID=${OBJ_ID}.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867350
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoТ.е. по этому запросу без дополнительной информации только
KEY fkIdx (fkObjID)

И то только если индекс на внешний ключ не создаётся сервером автоматически. Как я и
сказал выше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867389
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНо в зависимости от используемой СУБД и её оптимизатора могут быть нюансы.

+++

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

fkObjID, orderNum, objName

1) поиск по индексу
2) исключение сортировки за счет считывания упорядоченных данных из индекса (зависит от БД и настроек, сортировка должна быть binary, для Oracle могут потребоваться хинты INDEX_ASC)
3) все поля результата в индексе, исключается обращения к исходной таблицы

Сортировка по индексу - крайне приятная вщеь, если в результате выбираются десятки-сотни тысячь записей

Отстувие обращение к исходной таблице - вместо рандом доступа к индексу и исходной таблице, получаем упорядоченный (последовательный) доступ к индексу. Шминделя крутящихся дисков говорят спасибо
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867480
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

мало ли какая мне сортировка в такой выборке понадобится. Надо с каждым полем (и не с одним) FK склеивать? По-моему, лишнее это.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867562
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXILeonid Kudryavtsev,

мало ли какая мне сортировка в такой выборке понадобится. Надо с каждым полем (и не с одним) FK склеивать? По-моему, лишнее это.wat? переведите пожалуйста..
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39867688
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

1. Первичный ключ где?
2. Уникальный индекс надо сделать. Он покроет как FK, так и вопрос целостности данных. Уникальные индексы вообще не для скорости работы создаются и не для того, что они кому-то очень нравятся.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39868257
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotДайте пожалуйста дельный совет!
для начала надо разделять логические условия на таблицу и "физические". Под логическими будут определены такие вещи как PK и требования уникальности, сервер для них создаст необходимые индексы и они не зависят ни от каких запросов. Дальнейшие индексы и необходимость в них определяется исключительно как с данными будут работать, например нужно определить кластерный индекс. Необходимость в каждом конкретном индексе определяется типами запросов к базе, OLAP/OLTP, результатами нагрузочных тестов итп
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39868321
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если такой индекс:
Код: sql
1.
KEY objOrdIdx (fkObjID, orderNum)


слепить при таком ORDER BY:
Код: sql
1.
ORDER BY orderNum ASC


то он вообще не сработает
потому что orderNum работает ПОСЛЕ fkObjID
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39868356
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordдля начала надо разделять логические условия на таблицу и "физические". Под логическими будут определены такие вещи как PK и требования уникальности, сервер для них создаст необходимые индексы и они не зависят ни от каких запросов. Дальнейшие индексы и необходимость в них определяется исключительно как с данными будут работать, например нужно определить кластерный индекс. Необходимость в каждом конкретном индексе определяется типами запросов к базе, OLAP/OLTP, результатами нагрузочных тестов итп
Охеренно понятный и аргументированный ответ! Спасибо!

Сергей Васкецов1. Первичный ключ где?
2. Уникальный индекс надо сделать. Он покроет как FK, так и вопрос целостности данных. Уникальные индексы вообще не для скорости работы создаются и не для того, что они кому-то очень нравятся.
1. Первичный ключ там - это id SERIAL
2. Хорошо, учту.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39868365
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

СУБД-то какая?

Некоторые СУБД умеют использовать индекс KEY objOrdIdx (fkObjID, orderNum) для отбора записей по fkObjID и последующей сортировки по orderNum.

CHAR(255) выглядит странно. Почему не VARCHAR ?

И так ничего и не было сказано про статистику/демографию данных.
А это важно для решения использовать или не использовать тот или иной индекс.
Например, если условие aa.fkObjID=${OBJ_ID} отбирает половину записей таблицы, то никакие индексы не помогут, за исключением, разве что, покрывающего. Будет ли толк от покрывающего индекса - тоже зависит от множества факторов, вплоть до того, лежит ли он уже в кэше (и помещается ли туда) или нет.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39868461
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
СУБД - MariaDB 10.3
CHAR(255) - это просто тут написал. Весь пример таблиц - чисто для наглядности. Сама идея только что есть параметр по которому отбирают, и есть по которому сортируют.

Статистика базы относительно равномерная предполагается. Т.е. для разных ${ObjID} сравнимые кол-ва записей.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39868642
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotВ такой ситуации надо ли в таблице определять такие индексы:
Код: sql
1.
KEY fkIdx (fkObjID)


Зависит от, но скорее стоит, чем нет.

kormot
Код: sql
1.
KEY ordIdx (orderNum)


Совершенно бессмысленно.

kormot
Код: sql
1.
KEY objOrdIdx (fkObjID, orderNum)


Такой индекс может иметь смысл, если количество orderNum на один objID велико и если СУБД сумеет его использовать. Но скорее всего, он окажется на уровне первого по полезности.

kormot
Код: sql
1.
UNIQUE KEY objOrdIdx (fkObjID, orderNum)


Если мешать не будет, лучше определить. Бывает, что декларативные ограничения целостности очень лихо спасают задницу от неприятностей.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39869877
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого запроса подойдут индексы

KEY fkIdx (fkObjID),

или

KEY objOrdIdx (fkObjID, orderNum)


один из двух.

Второй потенциально может быть испльзован для ORDER BY
но если записей немного, скажем, 10-30, то смысла в составном индексе вместо по одному полю, мало.
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39871024
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо Уважаемые, за полезные ответы!
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39871131
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для 10-30 индекс вообще не нужен
индекс от сотен начинается, даже от 1000
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39872707
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

Тут надо делать индекс

KEY fkIdx (fkObjID),

ИЛИ

KEY objOrdIdx (fkObjID, orderNum)
...
Рейтинг: 0 / 0
Какие стоит указать индексы?
    #39872708
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин!Блин!Блин!Блин!Блин!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Какие стоит указать индексы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]