Я збираюся зробити на сайті живий пошук (як в Google). Знайшов досить багато матеріалів на цю тему. Лише через одного моменту я не можу приступити. Мій рівень знань досить малий і я не можу зрозуміти як мені вирішити наступну проблему:
Ось з сайту, за допомогою Ajax надходить запит на .php скрипт, який повинен взяти з бази інфу. Питання - як можна швидко підключитися до бд або взагалі зробити це заздалегідь? Пояснень я не знайшов. Я так зрозумів, що найбільше часу витрачатися саме на підключення до бд. Підключатися до неї після введення кожного символу не вийде. Все буде виснути. У всіх прикладах, які я бачив просто писалося $ mysqli-> query (.). Строк підключення там не було, немов воно вже як таке є.
Я спробував вникнути в систему "постійних підключень", але так і не розібрався, що до чого. До того ж там обмеження на кількість одночасних з'єднань є.
Дуже прошу допомогти з цим питанням. Через нього буквально стоїть весь проект.
Про те, як реалізувати автодоповнення найбільш оптимально.
Просто пошук в базі однозначно неефективний: на один введення користувача може припасти до десятка запитів, кожен з яких лізе в базу, в якій теоретично можуть лежати хоч мільйони записів, а всякі wildcard пошуки обожнюють страждати. за ними треба уважно стежити, щоб вони дійсно використовували індекси; крім того, упоротий фронтенд, використовуючи плече у вигляді кількості приходять на сайт, може легко все покласти, відправляючи за запитом на кожну букву і мультіпліціруя вхідний трафік в два-три-п'ять разів. Загалом, шлях робочий, і, більш того, при належній старанності, що працює швидко, але не моментально і вимагає підтримки; крім того, кожен інсерт-апдейт буде шматувати індекс і швидкодія.
Trie будується для деяких послідовностей, за якими потрібно виконати пошук (в нашому випадку це рядки, або послідовності символів). Вузол в Trie є структурою, в якій зберігаються значення. про які буде сказано трохи пізніше, і посилання на дочірні вузли у вигляді map (асоціативного масиву) - кожен дочірній вузол зберігається з ключем типу сутності з послідовності (в нашому випадку ключем буде символ). У вигляді значень зберігаються або безпосередньо шукані значення, або посилання на них (наприклад, айдішнікі, хоча якщо з ними доведеться ще раз лізти в базу, то етоабсолютно неефективно).
При заповненні Trie послідовності перетворюються в гілки, що йдуть з початкового вузла, і в вузол, відповідний останньої суті з послідовності записується значення, відповідне цій послідовності. Якщо я реалізую пошук по продуктам, і мені попадеться запис "молоко", то я зроблю з неї гілка з шести вузлів (якщо вони ще не існують в цей момент), і в останній вузол запишу сам продукт. Якщо після цього мені попадеться "молоковод", то я зроблю гілка з дев'яти вузлів (перші шість з яких вже існують), і в "д" я запишу безпосередньо молоковода.
Навіщо це все потрібно? У разі, якщо а) завантажити це все в оперативну пам'ять, б) тримати це там між запитами, щоб не вивантажувати кожен раз (тут з PHP будуть проблеми, так, але демонів ніхто не відміняв) і в) вивантажити взагалі всю інформацію, яка повинна видаватися при пошуку (а це рідко більше ніж дві-три рядки), то пошук перших N результатів по такому дереву буде виконуватися за мілісекунду навіть на хреново залозі. Для пошуку досить просто розкласти рядок на послідовність символів, знайти відповідний вузол, і наповнювати кошик пошуку з поточного, а потім і дочірніх вузлів до тих пір, поки дочірні вузли не закінчаться або кошик не заповниться доверху. В середньому по лікарні складність пошуку становитиме десь шістнадцять символів, що до неймовірності шалено прекрасно в порівнянні з повним проходом всього масиву.
Єдина проблема Trie - це те, що по ній здійснюється префіксний пошук, і для пошуку підрядка доведеться згодовувати їй суфікси один за одним (ефективний нечіткий пошук взагалі складно уявити); також для ефективного пошуку зазвичай поруч треба тримати звичайний мап виду
На сторінці, на якій буде проводитися живий пошук, необхідно створити постійне з'єднання за допомогою mysqli:
Для того, щоб підключення було постійним, необхідно додати префікс "p:". Про це я знав.
Після цього, на початку php скрипта, до якого звертається ajax, необхідно написати ту ж сходинку. Якщо з'єднання вже існує, то ніякого підключення виявилася відбудеться, зате у вас вже буде об'єкт з'єднання.
Сторінка, на якій є форма живого пошуку - somepage.php
Оброблювач Ajax запиту - handler.php