Russian Qt Forum
Сентябрь 30, 2024, 18:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ускорить алгоритм поиска БД  (Прочитано 6876 раз)
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 со словом, введенным пользователем
Записан
Kolobok
Гость
« Ответ #1 : Март 30, 2012, 14:59 »

А где поиск в базе?
Записан
V1KT0P
Гость
« Ответ #2 : Март 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 со словом, введенным пользователем
Ты пытаешься не то место ускорять. Тут не поиск в строке будет тормозить а БД. Проще всего для каждого слова хранить список идентификаторов строк к которым оно относится. Памяти будет жрать больше, но и скорость будет максимальная.
Записан
jatsuk
Гость
« Ответ #3 : Март 30, 2012, 15:23 »

для каждого слова хранить список идентификаторов строк к которым оно относится

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

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

Kolobok, что значит где. делаю запрос для определенной таблицы БД, и определенному столбцу, потом каждую строку разбираю на переменные qstring  и сравниваю с искомым значением, вот и весь поиск )
« Последнее редактирование: Март 30, 2012, 15:26 от jatsuk » Записан
V1KT0P
Гость
« Ответ #4 : Март 30, 2012, 15:48 »

для каждого слова хранить список идентификаторов строк к которым оно относится

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

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

Kolobok, что значит где. делаю запрос для определенной таблицы БД, и определенному столбцу, потом каждую строку разбираю на переменные qstring  и сравниваю с искомым значением, вот и весь поиск )
Про сравнение строк, стандартный аллгоритм сравнения такой: посимвольное сравнение, при первом же несовпадение символа возврат отрицательного значения. Так что ты что-то не так понял.
Теперь про БД. Представь что у тебя в базе данных хранится 500 000 записей. А тебе надо со словом "кот", которых там всего 200 записей. Так вот когда ты выполнишь "SELECT kl_bol,n_bol FROM sim" БД тебе вернет сразу все 500 000 записей. Вот ты и будешь среди 500 000 записей искать эти 200 штук.
Записан
jatsuk
Гость
« Ответ #5 : Март 30, 2012, 16:01 »

Я так  и не понял поняли вы меня или нет )
короче, вот пример...

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

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

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


А на счет базы в 500000 записей , то база содержит 270 таких записей и будет их максимум около 300
Записан
V1KT0P
Гость
« Ответ #6 : Март 30, 2012, 16:03 »

Я так  и не понял поняли вы меня или нет )
короче, вот пример...

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

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

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


А на счет базы в 500000 записей , то база содержит 270 таких записей и будет их максимум около 300
А если так, то да будет побыстрее.
Записан
_OLEGator_
Гость
« Ответ #7 : Март 30, 2012, 16:07 »

А конструкции типа LIKE "%слово%" база поддерживает?
Записан
jatsuk
Гость
« Ответ #8 : Март 30, 2012, 16:09 »

конечно, а это чем то поможет ?
а давно пользовался LIKE и уже толком не помню зачем он)

LIKE %слово% тоесть оно будет искть в строке содержится оно или нет ?
Записан
_OLEGator_
Гость
« Ответ #9 : Март 30, 2012, 16:12 »

Да, будет искать в строке содержится оно или нет
Поидее должно ускорить выборку, пробуй.

И освежить тогда знания по QSL запросам и синтаксису.
Записан
jatsuk
Гость
« Ответ #10 : Март 30, 2012, 16:15 »

Да, это будет быстрее...
одна проблема будет возникнуть, надо проверитью

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

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

надо подумать...
Записан
Whiplash
Гость
« Ответ #11 : Апрель 02, 2012, 11:09 »

Мне кажется, тут с базой что-то не то.
Почему список понятий хранится через запятую в текстовом поле, а не в отдельной связанной таблице?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 21.