Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

Индексирование базы данных   Найти похожие ветки 

 
Serg1981 ©   (2005-08-03 21:04) [0]

Привет всем ! Как известно, индексы в БД строят для ускорения поиска. А в чём физический смысл индексов, как они строятся, по какому принципу ? Просто создаю БД своего формата и хочу в ней строить индексы самостоятельно. Подскажите что-нибудь, или где можно почитать про это ? Заранее спасибо.


 
DrPass ©   (2005-08-03 21:20) [1]

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


 
Piter ©   (2005-08-03 22:16) [2]

DrPass ©   (03.08.05 21:20) [1]
значение поля - положение записи в таблице


что за бред. Такой индекс будет занимать как база данных. Да фактически и будет являться базой данных.


 
Джо ©   (2005-08-03 22:29) [3]


>  [2] Piter ©   (03.08.05 22:16)
> DrPass ©   (03.08.05 21:20) [1]
> значение поля - положение записи в таблице
> что за бред.

В простейшем случае, индекс - это и есть пары значений: поле-ссылка на него в таблице.


 
wicked ©   (2005-08-03 23:11) [4]

> Джо ©   (03.08.05 22:29) [3]

> В простейшем случае, индекс - это и есть пары значений:
> поле-ссылка на него в таблице.

имхо, в простейшем случае индекс - это массив указателей на записи, отсортированный определенным образом... я бы так делал... :-P


 
DrPass ©   (2005-08-03 23:29) [5]


> Piter ©   (03.08.05 22:16) [2]

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


 
Serg1981 ©   (2005-08-03 23:42) [6]


> имхо, в простейшем случае индекс - это массив указателей
> на записи, отсортированный определенным образом


Допустим, я перечислю, что фамилия ИВАНОВ есть в записях 1, 3, 7 и 28. При попытке найти ИВАНОВА я сразу выдам на экран эти записи. Но если пользователь захочет искать часть фамилии, например, ИВАНО, такого индекса у меня не будет, придётся опять пробегать по всем записям ?


 
DrPass ©   (2005-08-03 23:54) [7]

Ну-с, молодой человек, если вы сели за компьютер не в Doom3 бегать, а программы писать - тренируйте логическое мышление. Без него никак...


 
Serg1981 ©   (2005-08-03 23:57) [8]

Ну не писать же индекс на каждую букву в отдельности.

P.S. а в игры я не играл никогда, тем более в компьютерные.


 
DrPass ©   (2005-08-04 00:09) [9]

Ну это же так просто - расположить слова в индексе в алфавитном порядке, и искать не по полному совпадению, а по подобию.


 
Джо ©   (2005-08-04 01:07) [10]

Малехо ликбеза для автора топика и (персонально) для Piter"а ;-)

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

читать: http://biology.krc.karelia.ru/misc/access/page6.htm.


 
Lamer@fools.ua ©   (2005-08-04 07:38) [11]

Еще бывают всякие там кластерные индексы, когда записи физически отсортированы по ключу...


 
Verg ©   (2005-08-04 08:26) [12]

если пользователь захочет искать часть фамилии, например, ИВАНО, такого индекса у меня не будет, придётся опять пробегать по всем записям ?

Зачем же по всем. Индексные записи отсортированы по значению ключевого поля. В данном случае - фамилия. При поиске ты должен по обычному алгоритму (бинарный поиск) определить место в индексной таблице, которое должена была бы занять запись, если бы значение поля "фамилия" имело искомое значение. Если искомая фамилия задана неполностью("ивано"), то ты найдешь позицию в индексе (i), где все "иванов", "иванова" и т.д. распологаются строго ниже (иногда эту операцию называют FindNearest). Осталось пройтись вниз по индексу и выдать в качестве результата все записи со значением поля начинающимся на "ивано".
Надо так же проверить i-1 индекс, на предмет точного равенства с "ивано".


 
Думкин ©   (2005-08-04 08:47) [13]

>  [12] Verg ©   (04.08.05 08:26)

Это если начало. А если кончало или середка также? Про это он и спрашивает.


 
Sergey13 ©   (2005-08-04 09:18) [14]

2 Serg1981 ©   (03.08.05 21:04)
Странное желание - не зная про индексы писАть свою БД.
ИМХО.


 
Holy ©   (2005-08-04 09:28) [15]


> Думкин ©   (04.08.05 08:47) [13]


ИМХО почти тоже самое... Допустим надо найти ?ивано, т.е. ивано со второй буквы. В пределах одинаковой первой буквы задача сводится к > Verg ©   (04.08.05 08:26) [12]
Для большего количества букв больще отрежем...


 
Holy ©   (2005-08-04 09:32) [16]


> Для большего количества букв больще отрежем...

Читать Для большего количества букв больше отрежем... Т.е. не сравнение с первого символа записи, а убираем эн первых букв.

А вообще согласен с тем, что индексирование это наука...


 
Sergey13 ©   (2005-08-04 09:35) [17]

Вообще-то в уже написанных БД, при поиске по %ивано индекс не используется, насколько я знаю. Идет полный перебор.


 
Думкин ©   (2005-08-04 09:38) [18]

> [17] Sergey13 ©   (04.08.05 09:35)

Вот и я про тоже.


 
Nikolay M. ©   (2005-08-04 09:56) [19]

Про индексы в MS SQL есть отличнейшая статья
http://www.sql.ru/articles/mssql/03013101Indexes.shtml
БОльшая часть написанного относится к индексам вообще, а не только применительно к MS SQL.


 
Desdechado ©   (2005-08-04 11:01) [20]

Serg1981 ©   (03.08.05 23:57) [8]
> в игры я не играл никогда
тяжелое у тебя детство было...
у некоторых игрушки деревянные, а у тебя вообще никаких...


 
Serg1981 ©   (2005-08-04 11:49) [21]

to Nikolay M. ©   (04.08.05 09:56) [19] :
Большое спасибо !

to Desdechado ©   (04.08.05 11:01) [20] :
Детство у меня было нормальным, на вкус и цвет товарищей нет. А если нечего сказать по существу темы, то лучше помолчать.


 
Digitman ©   (2005-08-04 12:41) [22]


> в чём физический смысл индексов


индекс есть упорядоченный (по тому или иному критерию) список, каждый элемент которого есть некая "ссылка" на "местоположение" индексируемого данным индексным элементом некоего сопоставленного с ним элемента индексируемого списка

простой пример, ч.н. "на огурцах" :

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

BBBB <CRLF>
AAA <CRLF>
ZZZZZ <CRLF>
XX <CRLF>
DDDD <CRLF>
FFFFFF <EOF>

начало каждой из этих строк в этом файле имеет строго определенное смещение (в байтах) отн-но начала файла :

BBBB (+0)
AAA (+6)
ZZZZZ (+11)
XX (+18)
DDDD (+22)
FFFFFF (+28)

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

AAA
BBBB
DDDD
FFFFFF
XX
ZZZZZ

для этого, очевидно, следует прочитать от начала до конца весь файл, строка за строкой, после чего собственно отсортировать прочитанное и вернуть готовый отсортированный список строк

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

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

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

тут же возникает вопрос - если "накладные расходы" неизбежны,  нельзя ли их как-то минимизировать ?

ответ - можно !

пожертвовав , скажем, дополнительными затратами на используемую емкость носителя, мы можем при значительном числе записей в файле ощутимо выиграть в скорости считывания+сортировки

для этого упомянутому файлу со строками создается и ставится в однозначное соответствие структурированный индексный файл следующего вида :

+06 "AAA   "
+00 "BBBB  "
+22 "DDDD  "
+28 "FFFFFF"
+18 "XX    "
+11 "ZZZZZ "

в этом файле оригинальные строковые значения УЖЕ упорядочены по требуемому критерию

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

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

вот еще простой наглядный пример :

TQuery.ParamByName() - метод-ф-ция, ищущая и возвращающая объект-параметр в списке объектов-параметров по имени искомого параметра, предположим - действует "тупым" итеративным перебором каждого эл-та списка на предмет совпадения имени параметра с заданным

в то же время TQuery.Params[индекс] позволяет получить доступ к искомому объекту не по его имени , а по его "номеру" (индексу) в списке объектов-параметров... при этом позиционирование в списке не требует каких-либо весомых затрат, как в случае проверки каждого имени на совпадение - размер элемента списка умножается на индексный номер элемента, к полученному произведению прибавляется адрес начала списка, результат есть готовая ТОЧНАЯ позиция элемента в списке(безо всяких циклов последовательного чтения/сравнения эл-тов списка, что потребовало бы ощутимо большее время)


 
Desdechado ©   (2005-08-04 16:18) [23]

Serg1981 ©   (04.08.05 11:49) [21]
> Детство у меня было нормальным
Выходит, у остальных оно было того, э-э ... ненормальным? Ведь дети ВСЕГДА играют. И рос ты среди других нормальных неиграющих детей? Не верю! (с)

> на вкус и цвет товарищей нет.
Эт точно! (с)

> А если нечего сказать по существу темы, то лучше помолчать.
Тема же в "Потрепаться", а не в "Базах". Там бы я тебе по существу ответил, а здесь треплюсь :)
Мое право.


 
TUser ©   (2005-08-04 17:07) [24]

> Вообще-то в уже написанных БД, при поиске по %ивано индекс не используется, насколько я знаю. Идет полный перебор.

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


 
oldman ©   (2005-08-04 17:10) [25]


> Serg1981 ©   (03.08.05 21:04)  
> Просто создаю БД своего формата...


Всякое видел, но шоб так... А чем существующие не устраивают?
А если есть разум создать свой формат БД, умные книжки по индексированию почитать никак?

Без обид...


 
Sergey13 ©   (2005-08-04 17:11) [26]

2[24] TUser ©   (04.08.05 17:07)
>  в генетических базах данных.
А что это? РСУБД с данными по генетике или что другое?


 
Serg1981 ©   (2005-08-04 17:30) [27]

to oldman:

Против всех существующих "заводских" БД есть отмычки и средства взлома.


 
Sergey13 ©   (2005-08-04 17:32) [28]

2 [27] Serg1981 ©   (04.08.05 17:30)
Ты когда замок будешь делать тоже сюда за примерами пойдешь спрашивать?
8-)


 
TUser ©   (2005-08-04 17:41) [29]

> А что это?

Банки известных последовательностей ДНК и белков. Например, вот тут лежит геном человека
http://www.ncbi.nlm.nih.gov/genome/guide/human/


 
Serg1981 ©   (2005-08-04 20:02) [30]

to Sergey13 [28] :

так ведь я же не про защиту и шифрование спрашивал, а про индексы. С защитой сам справился.


 
programania ©   (2005-08-04 20:21) [31]

>А в чём физический смысл индексов

В том что индекс меньше чем данные так как в нем только ключ и ссылка на запись в файле данных
поэтому его можно ввести в память, отсортировать и быстро в нем искать.
Если ключ большой то это преимущество теряется
однако тогда в качестве ключа можно использовать его CRC32 всего в 4 байта

Индексы были нужны когда память была маленькая
теперь чем больше память тем меньше потребность в индексах
сейчас большинство файлов полностью входит в память и сортируется за секунды
и проще обойтись без индексов ведь индексы кроме создания
нужно поддерживать, то есть делать все вставки и удаления как и в данных
и чтоб при этом их не переписывать нужно B-дерево а это сложно
поэтому базы данных работают раз в 10 раз медленнее чем напрямую с файлом.
тем более что все равно для поиска по выражению придется искать в данных


 
Serg1981 ©   (2005-08-04 20:41) [32]

Всё бы хорошо, но база уже порядка 600 МБайт и это не предел, а на сервере у меня 512 Мб оперативной памяти :(


 
wicked ©   (2005-08-04 21:02) [33]

> programania ©   (04.08.05 20:21) [31]
ну страхов вы понаписывали...
судя по вашим словам, FoxPro никогда бы не смог проиндексировать таблицу с сотнями тысяч-миллионами записей... однако, он это делал... :-/


 
Petr V. Abramov ©   (2005-08-04 21:38) [34]

programania ©   (04.08.05 20:21) [31]
 А индексы только для сортировки используются, по-вашему? Вы бы, мягко говоря, не выражались так категорично насчет "проще обойтись без индексов"


 
programania ©   (2005-08-04 22:05) [35]

>wicked ©   (04.08.05 21:02) [33]
>ну страхов вы понаписывали...
какие слова вас так испугали?

>судя по вашим словам, FoxPro никогда бы не смог проиндексировать таблицу
по каким словам?

> Petr V. Abramov ©   (04.08.05 21:38) [34]
> А индексы только для сортировки используются, по-вашему?
...отсортировать и быстро в нем искать. [31]
сортировка индексов как раз и служит для быстрого поиска

>Вы бы, мягко говоря, не выражались так категорично насчет "проще обойтись без индексов"
я же обьяснил когда проще и почему, разве это категорично?
или вы считаете что самому создать и поддерживать индексы просто?
ведь именно это собрался делать автор темы.
>хочу в ней строить индексы самостоятельно [1]


 
DrPass ©   (2005-08-04 23:53) [36]


> чем больше память тем меньше потребность в индексах

С чего это вдруг?
> большинство файлов полностью входит в память и сортируется
> за секунды

А это?
> проще обойтись без индексов ведь индексы кроме создания
> нужно поддерживать, то есть делать все вставки и удаления
> как и в данных
> и чтоб при этом их не переписывать нужно B-дерево а это
> сложно

Чаще всего операций вставки/удаления производятся намного реже, чем выборки. Так что все эти сложности лучше "перетерпеть". Хотя, конечно, это зависит от поставленных перед СУБД целей. Телефонный справочник на 500 записей будет прекрасно работать и без индексов


 
Petr V. Abramov ©   (2005-08-05 00:30) [37]

> programania ©   (04.08.05 22:05) [35]
> сортировка индексов как раз и служит для быстрого поиска
 Никто их не сортирует, сортируют выборку из таблиц. Иногда индекс этому помогает

> или вы считаете что самому создать и поддерживать индексы просто?
 Не просто. Но это не значит, что для приемлемого функционала СУБД они не нужны. Даже если паче чаяния вся таблица влезает в память.


 
programania ©   (2005-08-05 13:35) [38]

>DrPass ©   (04.08.05 23:53) [36]
>> чем больше память тем меньше потребность в индексах
>С чего это вдруг?
>Телефонный справочник на 500 записей будет прекрасно работать и без индексов
А при достаточно большой памяти вы будете правы и для 500 000 уловили связь?

> большинство файлов полностью входит в память и сортируется
> за секунды
>А это?
А это из личного опыта
Вот сейчас посмотрел базу на работе
из 1123 файлов db только 11 или 1% больше 10мб а самый большой 66 мб
и для такой мелочи возиться с индексами?

>Чаще всего операций вставки/удаления производятся намного реже, чем выборки.
Да хоть 1 раз все равно придется делать все полностью а не терпеть.

>Petr V. Abramov ©   (05.08.05 00:30) [37]
> Никто их не сортирует, сортируют выборку из таблиц. Иногда индекс этому помогает

НеОтсортированные индексы теряют смысл
а сортируются они в процессе создания обычно путем заполнения B-дерева
это всего лишь один из методов сортировки

>Но это не значит, что для приемлемого функционала СУБД они не нужны.
Это значит что вы без индексов никогда не работали?
а я этим занимался 20 лет причем при свободной памяти < 500Кбайт
и приемлемом функционале

>Serg1981 ©   (04.08.05 20:41) [32]
>Всё бы хорошо, но база уже порядка 600 МБайт и это не предел, а на сервере у меня 512 Мб оперативной памяти :(

Не знаю ваших деталей и не буду говорить категорично но мягко говоря
даже в этом случае можно без индексов
Новые записи писать в дополнительный файл и держать его в памяти
В конце дня/месяца сортировать и сливать с основным по ключу за 1-2 минуты
При запросе по ключу в новых записях быстро искать пусть даже последовательно
ведь их немного и они в памяти, а основной файл всегда будет отсортирован
и запросы по ключу будут быстро выполняться двоичным поиском
не говоря уже о обработке всего файла например для создания отчетов
или выборки по выражениям тут разница будет в десятки раз
т.к. без индексов такая обработка займет время последовательного чтения файла
600мб/(10..40мб в сек)<=1 минуты,  проверил фильм 690мб читается 43сек
причем дефрагментацию никогда не делал, а с индексами
придется читать файл в случайном порядке по 1 записи,
страшно подумать сколько это займет и жалко диск испытывать.

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



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.044 c
14-1122904640
oldman
2005-08-01 17:57
2005.08.28
Кто нибудь боролся с Яхой?


14-1123237373
12DFBDDh
2005-08-05 14:22
2005.08.28
У всех форм колбасит или только у меня?


1-1123154318
dreamse
2005-08-04 15:18
2005.08.28
Как в одном Listwiew e работать с двумя разными imageList ?


14-1122743563
MaksimkaP
2005-07-30 21:12
2005.08.28
Прокси сервер


14-1123227092
Lexer
2005-08-05 11:31
2005.08.28
Домен (сеть компании) + рабочая группа (инет кафе)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский