Russian Qt Forum

Qt => Базы данных => Тема начата: jatsuk от Март 30, 2012, 14:55



Название: Ускорить алгоритм поиска БД
Отправлено: jatsuk от Март 30, 2012, 14:55
Хочу ускорить поиск по моей БД, придумал метод, только не знаю будет ли от него реальный прирост скорости или это всё зря ???
Есть база .bd ... из её таблицы берутся значия
Пользователь вводит слово, например, кактус
В базе идет поиск по столбцу, в котором есть несколько таких слов, напимер: верблю, кактус, пустыня...
Если есть слово кактус, то блалала если нет блалала

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

oi.exec("SELECT kl_bol,n_bol FROM sim");
       while(oi.next())
   {
    
allsim = oi.value(0).toString(); //изымаем стоку из таблицы
QStringList list;
list = allsim.split(",", QString::SkipEmptyParts);

потом просто сравнивается каждое слово из QStringList со словом, введенным пользователем


Название: Re: Ускорить алгоритм поиска БД
Отправлено: Kolobok от Март 30, 2012, 14:59
А где поиск в базе?


Название: Re: Ускорить алгоритм поиска БД
Отправлено: V1KT0P от Март 30, 2012, 15:05
Хочу ускорить поиск по моей БД, придумал метод, только не знаю будет ли от него реальный прирост скорости или это всё зря ???
Есть база .bd ... из её таблицы берутся значия
Пользователь вводит слово, например, кактус
В базе идет поиск по столбцу, в котором есть несколько таких слов, напимер: верблю, кактус, пустыня...
Если есть слово кактус, то блалала если нет блалала

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

oi.exec("SELECT kl_bol,n_bol FROM sim");
       while(oi.next())
   {
    
allsim = oi.value(0).toString(); //изымаем стоку из таблицы
QStringList list;
list = allsim.split(",", QString::SkipEmptyParts);

потом просто сравнивается каждое слово из QStringList со словом, введенным пользователем
Ты пытаешься не то место ускорять. Тут не поиск в строке будет тормозить а БД. Проще всего для каждого слова хранить список идентификаторов строк к которым оно относится. Памяти будет жрать больше, но и скорость будет максимальная.


Название: Re: Ускорить алгоритм поиска БД
Отправлено: jatsuk от Март 30, 2012, 15:23
для каждого слова хранить список идентификаторов строк к которым оно относится

вы имеете ввиду прям в базе хранить все эти слова и все соответствующие им номера строк ?
да, для поиска это будет быстрее раз в 300 ))) но это надо делать такую таблицу в БД, а база уже заполнена. И будет сложнее писать редактирование строки, чтобы и там и там и там удалялось...

Так тот алгоритм, который я написал, хоть немного может ускорить поиск ?)

Kolobok, что значит где. делаю запрос для определенной таблицы БД, и определенному столбцу, потом каждую строку разбираю на переменные qstring  и сравниваю с искомым значением, вот и весь поиск )


Название: Re: Ускорить алгоритм поиска БД
Отправлено: V1KT0P от Март 30, 2012, 15:48
для каждого слова хранить список идентификаторов строк к которым оно относится

вы имеете ввиду прям в базе хранить все эти слова и все соответствующие им номера строк ?
да, для поиска это будет быстрее раз в 300 ))) но это надо делать такую таблицу в БД, а база уже заполнена. И будет сложнее писать редактирование строки, чтобы и там и там и там удалялось...

Так тот алгоритм, который я написал, хоть немного может ускорить поиск ?)

Kolobok, что значит где. делаю запрос для определенной таблицы БД, и определенному столбцу, потом каждую строку разбираю на переменные qstring  и сравниваю с искомым значением, вот и весь поиск )
Про сравнение строк, стандартный аллгоритм сравнения такой: посимвольное сравнение, при первом же несовпадение символа возврат отрицательного значения. Так что ты что-то не так понял.
Теперь про БД. Представь что у тебя в базе данных хранится 500 000 записей. А тебе надо со словом "кот", которых там всего 200 записей. Так вот когда ты выполнишь "SELECT kl_bol,n_bol FROM sim" БД тебе вернет сразу все 500 000 записей. Вот ты и будешь среди 500 000 записей искать эти 200 штук.


Название: Re: Ускорить алгоритм поиска БД
Отправлено: jatsuk от Март 30, 2012, 16:01
Я так  и не понял поняли вы меня или нет )
короче, вот пример...

пользователь вводит слово: казак
СЛОВА выровнены в строке по алфавиту..

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

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


А на счет базы в 500000 записей , то база содержит 270 таких записей и будет их максимум около 300


Название: Re: Ускорить алгоритм поиска БД
Отправлено: V1KT0P от Март 30, 2012, 16:03
Я так  и не понял поняли вы меня или нет )
короче, вот пример...

пользователь вводит слово: казак
СЛОВА выровнены в строке по алфавиту..

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

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


А на счет базы в 500000 записей , то база содержит 270 таких записей и будет их максимум около 300
А если так, то да будет побыстрее.


Название: Re: Ускорить алгоритм поиска БД
Отправлено: _OLEGator_ от Март 30, 2012, 16:07
А конструкции типа LIKE "%слово%" база поддерживает?


Название: Re: Ускорить алгоритм поиска БД
Отправлено: jatsuk от Март 30, 2012, 16:09
конечно, а это чем то поможет ?
а давно пользовался LIKE и уже толком не помню зачем он)

LIKE %слово% тоесть оно будет искть в строке содержится оно или нет ?


Название: Re: Ускорить алгоритм поиска БД
Отправлено: _OLEGator_ от Март 30, 2012, 16:12
Да, будет искать в строке содержится оно или нет
Поидее должно ускорить выборку, пробуй.

И освежить тогда знания по QSL запросам и синтаксису.


Название: Re: Ускорить алгоритм поиска БД
Отправлено: jatsuk от Март 30, 2012, 16:15
Да, это будет быстрее...
одна проблема будет возникнуть, надо проверитью

Если слова ограничиваются запятыми, например:

заяц, волк, пушистый заяц...
 так он найдет и в случае заяц и пушистый заяц, а если в строке нет заяц просто, а только пушистый заяц, а ввели заяц - тоже найдет

надо подумать...


Название: Re: Ускорить алгоритм поиска БД
Отправлено: Whiplash от Апрель 02, 2012, 11:09
Мне кажется, тут с базой что-то не то.
Почему список понятий хранится через запятую в текстовом поле, а не в отдельной связанной таблице?