AlexPetrovich Готовы некоторые теоретические итоги по теме индексов.
Цитата: По моему пытаться делать оптимизацию изобретая нестандартные SQL - это путь в никуда.
Нет. Я пытаюсь изобрести стандартные сервера SQL.
Пример - в экспериментах над крысами выяснилось что если приучить крысу нажимать рычажок чтобы крыса получала сыр, то потом если крыса хочет удовольствия она будет жать рычажок всегда, даже если не получает уже сыр и такая крыса может умереть с голоду. Мне не очень приятно чуствовать себя крысой и ничего не получать нажимая всякие кнопки. Путь крысы - путь в никуда.
Из предыдущих примеров видно что сервер выбрал себе модель поведения с индексами, но существует и другая модель. И так. Сервер считает справедливым использовать все индексы которые он обнаружит в условии:
>where a between 1 and 2
> b between 1 and 20000000000
> c between 1 and 20000000000
...
> z between 1 and 20000000000
То есть все индексы которые имеются - являются полезными именно для этого запроса и индексы обязаны быть использованными именно для полных вычислений каждого подусловия. Вру, - сервер считает что любой индекс одинакого полезен в качестве первого берущегося для последовательного чтения. То что я вру было проверено - меняем местами индексы в плане и запрос становится быстрее. Во первых следует заметить что индексы используются эффективно для локейтов (сортированного поиска) и так же для последовательного чтения когда известно заране что диапазон чтения будет всегда меньше чем количество данных в таблице.
В примере between 1 and 20000000000, но данных там точно between 10 and 20000000. И с какого тогда перепугу сервер делает вывод что индексы которые безумно полезны в других запросах так же полезны именно в этом запросе? А он делает этот вывод потому что в
S Q L нет возможности указать серверу что его модель поведения является неуместной.
Есть другая модель, это абсолютно не касается и не ломает планы по использованию индексов. По этой модели поведения для последовательных чтений используется только
1 индекс и он указан в запросе. Остальные индексы используются для локейтов поиска. При последовательном чтении первого индекса все остальные условия вычисляются только исходя из математики выражения только для фильтрации. Это другая модель поведения сервера по отношению к индексам. Такая модель поведения является вполне справедливой для запросов в которых участвуют связи между двумя таблицами, которые являются огромными а количество данных возвращаемых запросом всегда будет маленьким из за того что
ПО НЕПОНЯТНЫМ ПРИЧИНАМ ПРОГРАММИСТУ ИЗВЕСТНО ЕДИНСТВЕННОЕ ПОДУСЛОВИЕ ЗАПРОСА ФИЛЬРУЮЩЕЕ ДАННЫЕ МАКСИМАЛЬНО. Мне думается ему известно это условие в 100% запросов которые он пишет, и во всех 100% его знания запроса являются бесполезными. Если он получает ещё и удовольствие, то он точно крыса...
Цитата: По моему пытаться делать оптимизацию изобретая нестандартные SQL - это путь в никуда.
100% случаев стандартные SQL не даёт использовать мои знания тех данных с которыми он работает. Пользоваться таким SQL - путь в никуда. Вернее сервер вполне может мне помочь в 50% запросов, но только при использовании планов либо +0. То что существует +0 говорит о том что не мне одному приходится отключать конкретные индексы. Но эта возможность просто припарка, которая не позволяет реально выбрать другую модель отношения к индексам.
2) В случае когда я пишу слева на право сверху вниз запрос SQL мне удобнее определить первичный индекс до того как я начну писать джойны