Для char/varchar/text столбца, почему будет индекс для того столбца делать его быстрее для поиска?

Как другой парень сказал, сокет однозначно определяется с 4 кортежами (Клиентский IP, Клиентский порт, IP Сервера, Порт сервера).

серверный процесс, работающий на IP Сервера, поддерживает базу данных (значение, что я не забочусь, какую структуру данных таблицы/списка/дерева/массива/волшебства это использует) активных сокетов, и слушает на Порте сервера. Когда это получает сообщение (через стек TCP/IP сервера), это проверяет Клиентский IP и Порт против базы данных. Если Клиентский IP и Клиентский порт найдены в записи базы данных, сообщение передано к существующему обработчику, еще новая запись базы данных создается и новый обработчик, порожденный для обработки того сокета.

В первые годы ARPANET, определенные протоколы (FTP для одного) слушали бы указанный порт для запросов на установление соединения и ответа с портом передачи. Дальнейшая связь для того соединения пробежалась бы через порт передачи. Это было сделано для улучшения производительности на пакет: компьютеры были несколькими порядками величины медленнее в те дни.

5
задан chaos 9 September 2009 в 15:40
поделиться

6 ответов

Важным моментом является то, что индекс вообще не поможет при определенных видах поиска. Например:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%'

Никакая нормальная индексация не поможет этому запросу. Он навсегда обречен быть медленным. Выражение LIKE просто не саргируемо .

Почему? Сначала вам нужно понять, как работают индексы. В основном они переносят индексируемые столбцы вместе с первичным ключом (указателем записи) в новую таблицу. Затем они сортируют эту таблицу по индексированному столбцу, а не по ключу. Когда вы выполняете поиск с использованием индекса, он может очень быстро найти нужную строку (строки), потому что этот индекс сортируется для облегчения более эффективного поиска с использованием таких алгоритмов, как двоичный поиск и др.

Теперь посмотрите на этот запрос еще раз. Помещая подстановочный знак перед поисковым текстом, вы я только что сказал базе данных, что вы не знаете наверняка, с чего начинается ваш столбец. Никакая сортировка не поможет; вам все равно нужно просмотреть всю таблицу, чтобы убедиться, что вы найдете каждую запись, которая соответствует выражению. А это означает, что любой нормальный индекс в столбце бесполезен для этого запроса.

Если вы хотите найти в текстовом столбце строку поиска в любом месте столбца, вам нужно использовать что-то немного другое: полнотекстовый индекс.

Теперь для контраста взгляните на этот запрос:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'

Он отлично работает с обычным индексом, потому что вы знаете, как вы ожидаете начала столбца. Он по-прежнему может совпадать с отсортированными значениями, хранящимися в индексе, и поэтому мы можем сказать, что его можно настроить.

вам все равно нужно просмотреть всю таблицу, чтобы убедиться, что вы найдете все записи, соответствующие выражению. А это означает, что любой нормальный индекс в столбце бесполезен для этого запроса.

Если вы хотите найти в текстовом столбце строку поиска в любом месте столбца, вам нужно использовать что-то немного другое: полнотекстовый индекс.

Теперь для контраста взгляните на этот запрос:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'

Он отлично работает с обычным индексом, потому что вы знаете, как вы ожидаете начала столбца. Он по-прежнему может совпадать с отсортированными значениями, хранящимися в индексе, и поэтому мы можем сказать, что его можно настроить.

вам все равно нужно просмотреть всю таблицу, чтобы убедиться, что вы найдете все записи, соответствующие выражению. А это означает, что любой нормальный индекс в столбце бесполезен для этого запроса.

Если вы хотите найти в текстовом столбце строку поиска в любом месте столбца, вам нужно использовать что-то немного другое: полнотекстовый индекс.

Теперь для контраста взгляните на этот запрос:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'

Он отлично работает с обычным индексом, потому что вы знаете, как вы ожидаете начала столбца. Он по-прежнему может совпадать с отсортированными значениями, хранящимися в индексе, и поэтому мы можем сказать, что его можно настроить.

полнотекстовый индекс.

Теперь для контраста взгляните на этот запрос:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'

Это будет отлично работать с обычным индексом, потому что вы знаете, как вы ожидаете начала столбца. Он по-прежнему может совпадать с отсортированными значениями, хранящимися в индексе, и поэтому мы можем сказать, что его можно настроить.

полнотекстовый индекс.

Теперь для контраста взгляните на этот запрос:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'

Это будет отлично работать с обычным индексом, потому что вы знаете, как вы ожидаете начала столбца. Он по-прежнему может совпадать с отсортированными значениями, хранящимися в индексе, и поэтому мы можем сказать, что его можно настроить.

6
ответ дан 18 December 2019 в 13:16
поделиться

Индекс сортируется, а таблица - нет. Следовательно, когда вы выполняете поиск по индексу, он понимает, где найти строку, даже если там ' это разные значения для каждой строки в таблице.

Кроме того, индексы (как правило) меньше, чем таблица, поэтому для сканирования каждого столбца в таблице вам нужно просмотреть каждую строку. Поиск по индексу - это просто нахождение нужного места в индексе, его выбор, захват указателя на кластеризованный индекс, и вы переходите к остальной части строки.

4
ответ дан 18 December 2019 в 13:16
поделиться

Индекс, по сути, представляет собой таблицу с двумя столбцами, с индексированным полем в отсортированном порядке вместе с поиском PK. SO для строки, строки в нем отсортированы. Затем поиск может быть выполнен с использованием двоичного поиска вместо сканирования таблицы, что будет намного быстрее для почти любой длины таблицы.

0
ответ дан 18 December 2019 в 13:16
поделиться

Телефонная книга индексируется по фамилии.

1
ответ дан 18 December 2019 в 13:16
поделиться

Указатель по сути похож на указатель в книге, где каждое слово (в зависимости от книги), которое появляется в книге, помещается в указатель с номерами страниц, на которых это слово появляется. Указатель отсортирован по алфавиту, поэтому слово в указателе можно быстро найти. Если у вас не было указателя в книге, единственный способ найти все вхождения определенного слова - это прочитать всю книгу, отмечая, где это слово встречается.

Таблица - это то же самое. Если вы ищете запись с определенным значением столбца и у вас нет индекса, единственное, что может сделать база данных, - это перебрать всю таблицу, чтобы найти какое-либо совпадение.

1
ответ дан 18 December 2019 в 13:16
поделиться

Самый простой ответ - это еще пара вопросов:

  • Почему человек по его последнему имени очень быстро находит по телефону книга?
  • Почему найти человека по его первому имени не быстро в телефонной книге?
2
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: