Intereting Posts
не может изменить предел размера загрузки php Открыть локальный почтовый архив mbox с помощью imap_open () в PHP Magento – загрузка только настраиваемых продуктов Нужна помощь, эхо, отмеченные флажками, выбранные пользователем. Отслеживание в реальном времени на карте google Как обрабатывать покупку для 2checkout с завитком Можно ли проверить, существует ли установленный ключ Redis, и если он не существует, установите его, если он существует, а затем выйдите, все как транзакция Подключение функции PHP к запросу AJAX: что мне не хватает? XML с конечным тегом и без него (самозакрывающийся тег) Как отобразить изображение BLOB, хранящееся в базе данных MySql? Как конвертировать «Y / m / dh: i A» формат даты и времени в метку времени JSON Кодирование и декодирование символов UTF8 в PHP Предупреждение PHP: время прохода по ссылке устарело PHP перемещает узлы в родительский массив Datatables – выход Json – PostgreSQL – возвращает значение null

Простое, но тяжелое приложение, потребляющее много ресурсов. Как оптимизировать?

В настоящее время у меня есть одно приложение для мониторинга на производстве. Задачей этого монитора является сбор конкретных записей в социальных сетях, таких как facebook, twitter, youtube и т. Д.

Вот один простой пример вызова API из Twitter:

http://search.twitter.com/search?q=Stackoverflow&format=json

В принципе, это то, что делает система:

  1. Выберите поисковый запрос из базы данных с определенным заказом
  2. Вызовите API
  3. Соберите все идентификаторы статусов идентификаторов и идентификаторов пользователей из текущего поиска
  4. Проверьте базу данных, если она существует
  5. Запустите внедрение твитов, исключая существующие твиты и пользователей и предотвращая дублирование ошибок ввода.

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

ПРОБЛЕМА

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

Зачем?

Система имеет разделенные учетные записи, каждая из которых имеет определенные условия поиска, связанные с их конкретным бизнесом. Когда мы выполняем выбор, нам нужно выбрать только те, которые связаны с условиями нашей учетной записи. Мы не можем видеть твиты, которые не связаны с нами. Но один твит может быть на многих счетах.

Фактический запрос (оскорбление моих глаз)

SELECT * FROM tweets WHERE content LIKE '%searchterm1%' OR LIKE '%searchterm2%' OR LIKE '%searchterm3%' OR LIKE '%searchterm4%' OR LIKE '%searchterm5%' OR LIKE '%searchterm6%' OR LIKE '%searchterm7%' OR LIKE '%searchterm8%' (and son on...) 

Два возможных решения

a) Создайте таблицу tweets_searches, которая будет иметь два внешних ключа: tweet_id и search_id. Так что каждый твит в таблице твитов может быть связан с одним конкретным поисковым термином.

Поэтому вместо поиска определенной строки мы присоединяемся к этим таблицам.

b) Продолжайте поиск, но вместо этого, с полнотекстовым поиском, используя MATCH () AGAISNT () .

ГЛАВНЫЙ ВОПРОС

Достаточно ли этого, чтобы сократить потребление ресурсов, таких как процессор и оперативная память? Есть ли что-то лучшее, что я могу сделать?

Отказ от ответственности : это один из моих комментариев по этому вопросу, который может быть ответом:


Думаю, match ... against здесь уместен. Это так называемый «полнотекстовый поиск». Для более сложных поисков я бы использовал Sphinx – он индексирует вашу базу данных самостоятельно (имеет собственный механизм для нее) и выполняет поиск быстрее, чем MySQL