Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Poznaj najpopularniejsze słowa w MySQL / PHP

Najprostszym podejściem, jak sądzę, byłoby:

  • Utwórz dwie nowe tabele:keywords (id, słowo) i keywords_comments (identyfikator_słowa kluczowego, identyfikator_komentarza, liczba)
    • keywords zapisuje unikalny identyfikator i słowo kluczowe znalezione w tekście
    • keywords_comments przechowuje jeden wiersz dla każdego połączenia między każdym komentarzem zawierającym to słowo kluczowe. W count zapiszesz, ile razy to słowo kluczowe wystąpiło w komentarzu. Dwie kolumny word_id + comment_id razem tworzą unikalny lub bezpośrednio klucz podstawowy.
  • Pobierz wszystkie komentarze z bazy danych
  • Przeanalizuj wszystkie komentarze i podziel je według nieznaków (lub innych granic)
  • Zapisz te wpisy do swoich tabel

Przykład

Masz następujące dwa komentarze:

Teraz będziesz iterować nad nimi i podzielić je na nieznaki. Dałoby to w wyniku następujące słowa pisane małymi literami dla każdego tekstu:- Pierwszy tekst:cześć, jak, jesteś, ty- Drugi tekst:wow, cześć, moje, imię, is, stefan

Jak tylko przeanalizujesz jeden z tych tekstów, możesz go już ponownie wstawić do bazy danych. Myślę, że nie chcesz ładować 100.000 komentarzy do pamięci RAM.

Więc wyglądałoby to tak:

  • Przeanalizuj pierwszy tekst i uzyskaj powyższe słowa kluczowe
  • Zapisz każde słowo kluczowe w zakładce keywords jeśli jeszcze go tam nie ma
  • Ustaw odwołanie od słowa kluczowego do komentarza (keywords_comments ) i poprawnie ustaw liczbę (w naszym przykładzie każde słowo występuje tylko raz w każdym tekście, musisz to policzyć).
  • Przeanalizuj drugi tekst

Niewielka poprawa

Bardzo łatwym ulepszeniem, którego prawdopodobnie będziesz musiał użyć w przypadku 100 000 komentarzy, jest użycie zmiennej liczącej lub dodaj nowe pole has_been_analyzed do każdego komentarza. Następnie możesz je przeczytać komentarz po komentarzu z bazy danych.

Zwykle używam zmiennych liczących, gdy czytam dane fragmentarycznie i wiem, że dane nie mogą się zmienić z kierunku, w którym zaczynam (tj. pozostaną spójne do momentu, w którym obecnie jestem). Następnie robię coś takiego:

SELECT * FROM table ORDER BY created ASC LIMIT 0, 100
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100
…

Weź pod uwagę, że to działa tylko wtedy, gdy wiemy na pewno, że nie ma żadnych dat do dodania w miejscu, które naszym zdaniem już przeczytaliśmy. Np. za pomocą DESC nie zadziała, ponieważ mogą być wstawione dane. Wtedy całe przesunięcie by się zepsuło i przeczytalibyśmy jeden artykuł dwa razy i nigdy nie przeczytali nowego artykułu.

Jeśli nie możesz się upewnić, że zewnętrzna zmienna liczenia pozostaje spójna, możesz dodać nowe pole zanalizowane które ustawisz na true zaraz po przeczytaniu komentarza. Wtedy zawsze możesz zobaczyć, które komentarze zostały już przeczytane, a które nie. Zapytanie SQL wyglądałoby wtedy tak:

SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */

Działa to tak długo, jak długo nie zrównoleglasz obciążenia (z wieloma klientami lub wątkami). W przeciwnym razie musiałbyś upewnić się, że odczyt + ustawienie true jest atomarem (zsynchronizowanym).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hooki nie wyzwalają się podczas wstawiania nieprzetworzonych zapytań przez sequelize.query()

  2. Czy mogę skonfigurować Mysql do automatycznego partycjonowania?

  3. MySQL dający błąd zduplikowanego wpisu podczas próby zwiększenia pola daty?

  4. Co należy zindeksować, aby poprawić wydajność?

  5. Jak przesłonić przypisanie automatycznego przyrostowego klucza podstawowego podczas wstawiania wartości w tabeli MySQL?