Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [mysql 4.x] la cache e l'ottimizzazione

    Benvenuti all'ennesima sega mentale di skidx

    Dunque, il Mysql ha questa cosa meravigliosa che è la cache.
    Da quel che ho capito la cache viene invalidata ogni volta che la tabella viene modificata, correggetemi se sbaglio.

    Ora, io ho la seguente situazione:
    relazione post:commenti, 1 a N, normalizzata come al solito.

    Siccome è frequente che assieme un certo numero di post, mi vengano richiesti anche il numero di commenti per ogni post, avevo pensato di introdurre una piccola ridondanza, tenendo presente il fatto che le scritture sono sempre molto inferiori alle letture.
    Quindi utilizzerei un altro campo "numCommenti" per ogni post, incrementandolo ad ogni insert di un nuovo commento. In questo mondo prelevando i post potrei subito prendere anche il numero di commenti corrispondente, senza fare query aggiuntive.

    Però:
    le scritture dei commenti avvengono molto più frequentemente di quelle dei post, facendo in questo modo finirei per invalidare la cache della tabella post all'aggiunta di ogni commento, perdendo quindi il vantaggio in prestazioni che volevo ottenere con la mia ridondanza.

    Quindi la mia ipotesi:
    se aggiungessi una terza tabella, in relazione 1:1 con quella dei post, e andassi a scrivere lì il numero dei commenti, risolverei il problema oppure no?

    In altre parole, se ho due tabelle in una join, in una ho scritto da poco e nell'altra no, la cache della seconda viene comunque utilizzata nella mia query o viene ingnorata perché quella della prima tabella è stata invalidata?

    Spero di essermi spiegato.
    Grazie.

  2. #2
    ahem, mi rispondo da solo:
    "If a table changes, then all cached queries that use the table become invalid and are removed from the cache".

    Quindi la cache andrebbe a farsi benedire comunque.

    A questo punto la domanda è: meglio la ridondanza che evita una select con join con la cache invalidata spesso, o meglio la soluzione standard senza ridondanza ma con una query in più?

  3. #3
    aggiungi tranquillamente il valore che contiene il numero di commenti ... tantissimi software preferiscono fare un po di ridondanza ... ma far lavorare MOLTO meno il database ... e vero che usando COUNT(nometabella.*) è veloce ... ma deve comunque conteggiare i record in base ad una chiave e a questo ci va sommato che la tabella è joinata ... quindi fa molto meno lavoro se lo legge direttamente

    fare ridondanze non è una cosa cattiva, anzi, in situazioni come queste credo sia fondamentale

  4. #4
    grazie
    Ero sbilanciato anche io verso questa soluzione.

    Visto che ci sono faccio un'altra domanda, che è vagamente inerente.

    Supponiamo che io debba prendere un certo numero di post, selezionati in base a un criterio che chiameremo CONDIZIONE1, più o meno complesso.

    Avrò quindi SELECT id,... FROM post WHERE(CONDIZIONE1);

    Poi ho bisogno di tirar fuori anche i commenti relativi ai post appena selezionati.

    Le soluzioni posssibili credo sarebbero 3:

    1) SELECT ... FROM post,commenti WHERE(post.id=commenti.post_id AND CONDIZIONE1);
    La query implica di selezionare anche tutti i campi coinvolti in CONDIZIONE1.

    2) SELECT ... FROM commenti WHERE post_id IN (SELECT id FROM post WHERE(CONDIZIONE1));
    Questa utilizza una subquery che in pratica riesegue la prima query fatta sui post.

    3) in PHP metto i risultati della prima query in un array, prendo gli id e poi faccio una query di questo tipo:
    SELECT ... FROM commenti WHERE post_id IN ($id[0],$id[1],$id[2]....);
    facendo finta che quell'array id contenga gli id estratti in precedenza.

    Quale sarebbe la cosa migliore secondo voi?

  5. #5
    la 3° ... o la 2° ... ma la seconda richiede a priori mysql 4.1

    per fare la terza ... basta che tiri fuori tutti e ti implodi l'array ... e basta

    e nell'array che riempi ci metti tutti i dati che ti servono

  6. #6
    io sono orientato verso la terza, anche se complica un po' di più la parte php, perché la seconda, sebbene sia bellina bellina con la subquery, va a rieseguire pari pari una query che ho appena fatto, mi sembra uno spreco.

  7. #7

  8. #8
    Scusate, ma la cache di MySql viene cancellata ogni volta che si esegue l'update, oppure basta inserire un record?

  9. #9
    [supersaibal]Originariamente inviato da ZoneForum
    Scusate, ma la cache di MySql viene cancellata ogni volta che si esegue l'update, oppure basta inserire un record? [/supersaibal]
    quando le tabelle coinvolte cambiano, quindi update/insert/delete.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.