Vantaggi MyISAM rispetto a InnoDb

di il
11 risposte

Vantaggi MyISAM rispetto a InnoDb

A fronte della mancanza di alcune caratteristiche, a quanto ho capito la gestione delle foreign key con integrità referenziale annessa e soprattutto del supporto alle transazioni, sembrerebbe che le MyISAM fossero tabelle che generano meno carico sul server, quindi questo potrebbe farle preferire in certi contesti. Nel mio caso io le uso per tabelle temporanee, che per varie ragioni che adesso non è il caso di spiegare non possono essere le temporanee native MySql, nè in RAM né su disco. Se ci fosse un vero vantaggio di minor carico e magari altri potrei estenderne l'uso a tutta una serie di tabelle stabili, nelle quali non esiste problema di transazioni, essendo le modifiche limitate al singolo record, e anche molto rare. Tanto per fare un esempio, una tabella "NAZIONI", dove si capisce bene che i cambiamenti sono rari, e comunque, non essendoci dettagli, limitati al singolo record. Dell'integrità referenziale non me ne preoccupo, poiché preferisco gestirla a livello di codice.

La domanda dunque è: può valere la pena in quei casi usare le MyISAM invece delle InnoDB?

11 Risposte

  • Re: Vantaggi MyISAM rispetto a InnoDb

    Uno a caso...

    https://managedserver.it/innodb-vs-myisam-un-confronto-dettagliato-di-due-motori-di-archiviazione-mysql/

    13/02/2025 - Catafirro ha scritto:

    Tanto per fare un esempio, una tabella "NAZIONI", dove si capisce bene che i cambiamenti sono rari, e comunque, non essendoci dettagli, limitati al singolo record.

    essendo rari non penso valga la pena usare myisam se altre tabelle usano innodb anche perchè in caso di chiave esterna ti troveresti con una gestione a livello codice ed una a livello database.

    13/02/2025 - Catafirro ha scritto:

    Dell'integrità referenziale non me ne preoccupo, poiché preferisco gestirla a livello di codice.

    ma anche della tabella master. non ha senso una tabella master innodb e una detail con myisam. 

    Si pensa ad un ibrido come alla combinazione tra il meglio dell'uno e il meglio dell'altro ma in soldoni ti ritrovi con dover fare rattoppi dell'uno e dell'altro.

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - Catafirro ha scritto:

    ...

    La domanda dunque è: può valere la pena in quei casi usare le MyISAM invece delle InnoDB?

    Se non ti servono le transazioni non ci vedo controindicazioni. Però forse dovresti motivare meglio i tuoi dubbi prestazionali tra MyIsam  e InnoDB in quanto penso che, riferendomi al tuo esempio della tabella Nazioni, i records in gioco sono talmente pochi che il vantaggio prestazionale sia poco quantificabile.

    Quali sono le tue remore ad usare le tabelle temporanee di MySQL?

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - max.riservo ha scritto:

    Quali sono le tue remore ad usare le tabelle temporanee di MySQL?

    Non sono riuscito a farle funzionare nelle query pass-throught, dove ne avrei avuto bisogno. Ho una connessione globale che inizializzo quando entro nell'applicativo, e su quella istanzio tutti i miei bravi recordset ADO. Sempre su quella connessione genero una tabella temporanea che posso riempire con un recordset ADO, che condivide la connessione. Ma le query pass-throught, dove dovrei usarla, non la vedono. Non so se c'è il modo di fargli condividere la connessione globale, io non l'ho trovato, anche se, a dire il vero, non ci ho perso troppo tempo.

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - sihsandrea ha scritto:

    Uno a caso...

    https://managedserver.it/innodb-vs-myisam-un-confronto-dettagliato-di-due-motori-di-archiviazione-mysql/

    13/02/2025 - Catafirro ha scritto:

    Tanto per fare un esempio, una tabella "NAZIONI", dove si capisce bene che i cambiamenti sono rari, e comunque, non essendoci dettagli, limitati al singolo record.

    essendo rari non penso valga la pena usare myisam se altre tabelle usano innodb anche perchè in caso di chiave esterna ti troveresti con una gestione a livello codice ed una a livello database.

    13/02/2025 - Catafirro ha scritto:

    Dell'integrità referenziale non me ne preoccupo, poiché preferisco gestirla a livello di codice.

    ma anche della tabella master. non ha senso una tabella master innodb e una detail con myisam. 

    Si pensa ad un ibrido come alla combinazione tra il meglio dell'uno e il meglio dell'altro ma in soldoni ti ritrovi con dover fare rattoppi dell'uno e dell'altro.

    Bello l'articolo, grazie. Speravo di trovare qualcuno che avesse già esplorato questa strada. Riguardo le chiavi esterne non le faccio gestire comunque al MySql, per scelta. Le tabelle su cui ho pensato di usare il MyISAM non sono dettagli di master, ma tabelle di servizio, tipo nazioni, monete e simili. Penso che non ci siano differenze apprezzabili di carico sul server, visto che contengono solo qualche decina di record. Il problema potrebbe diventare più significativo per archivi storici, dove vengono riversati dati che poi si consultano soltanto. Forse in quel caso potrebbe valerne la pena?

  • Re: Vantaggi MyISAM rispetto a InnoDb

    Queste sono le query che io eseguo per copiare un record in tabella temporanea (nel mio applicativo in realtà copio più records legati in maniera gerarchica su più livelli), modificarne un campo e poi reinserirlo nella tabella di partenza :

    1 - CREATE OR REPLACE TEMPORARY TABLE QTOU SELECT * FROM QTOU_Headers WHERE Id_Quotation = 5665;
    2 - UPDATE QTOU SET ID_Quotation=0; ## Change the unique key
    3 - UPDATE QTOU SET QT_QuoteNumber = '2020-999QT';
    4 - INSERT INTO QTOU_Headers SELECT * FROM QTOU;
    5 - DROP TABLE QTOU;       -> Richiede Privilegio Drop (alternativa MariaDB : aggiungere OR REPLACE nel CREATE TABLE)

    1-  Per MariaDb si può usare l'opzione Or Replace che evita di dover avere i privilegi di Drop sulla tabella temporanea (non mi sembra che sia disponibile con MySQL)

    2- Azzera la chiave nella tabella temporanea (è un campo autoincrement) : costringe la generazione del nuovo ID (quando copiato nella tabella di partenza)

    3- Aggiorna altri campi della tabella temporanea

    4- Copia record da tabella temporanea a tabella di partenza

    5- (facoltativo) elimina la tabella temporanea

    Le query possono essere eseguite in sequenza su una connessione ADO globale aperta :

    gAdoCnn.Execute (mSQLCreate), mRecAffected
    gAdoCnn.Execute (mSQLUpdate), mRecAffected
    gAdoCnn.Execute (mSQLInsert), mRecAffected
    'mSQLCreate, mSQLUpdate e mSQLInsert contengono le query 1,2/3, 4

    oppure possono inviate tutte in un unico comando (valido solo per driver ODBC MySQL e non per MariaDB a patto che nella connessione ODBC sia stato abilitato il parametro MultiStatement) :

    gAdoCnn.Execute (mSQLCopyOneRecord), mRecAffected
    'mSQLCopyOneRecord contiene la concatenzaione delle precedenti query ovviamente ciascuna terminata dal ;

    Per recuperare il Last Insert ID (utile in caso di chiave di tipo AutoIncrement) occorre eseguire questa query sull'oggetto connection e farsi restituire un recordset :

    Dim ArLog       As ADODB.Recordset
    Dim sSql        As String
    sSql = "SELECT IF(ROW_COUNT() > 0, LAST_INSERT_ID(), 0);"
    Set ArLog = gAdoCnn.Execute(sSql)
    If Not ArLog.EOF Then
        vNewKey = ArLog(0)
    Else
        vNewKey = 0
    End If
    ' clean up
    ArLog.Close
    Set ArLog = Nothing
    
    'sSql = "SELECT LAST_INSERT_ID();"  'Non sicura : se qualcosa fallisce restituisce comunque l'ultimo Last_Insert_ID andato a buon fine

    La tabella temporanea viene eliminata automaticamente alla chiusura della connessione quindi dovrebbe essere disponibile per le query utilizzando la stessa connessione.

    13/02/2025 - Catafirro ha scritto:

    Non sono riuscito a farle funzionare nelle query pass-throught, dove ne avrei avuto bisogno. Ho una connessione globale che inizializzo quando entro nell'applicativo, e su quella istanzio tutti i miei bravi recordset ADO. Sempre su quella connessione genero una tabella temporanea che posso riempire con un recordset ADO, che condivide la connessione. Ma le query pass-throught, dove dovrei usarla, non la vedono. Non so se c'è il modo di fargli condividere la connessione globale, io non l'ho trovato, anche se, a dire il vero, non ci ho perso troppo tempo.

    Resta da verificare se sia disponibile (visibile) anche per le query PT ... ma mi sembrerebbe strano che non lo sia ... mostra eventualmente del codice.

  • Re: Vantaggi MyISAM rispetto a InnoDb

    Ho visto, lavori su una connessione ADO, come faccio io, e lì hai a disposizione le tabelle temporanee, che rimangono valide finché non chiudi la connessione. Ma le query PT non condividono quella connessione, e non vedono le tabelle temporanee. Quindi non possono usare le tabelle temporanee. Per scrupolo ho chiesto a chatgpt:

    è possibile usare le tabelle temporanee mysql nelle query pass-throught di access?

    ChatGPT ha detto:

    No, le tabelle temporanee di MySQL (CREATE TEMPORARY TABLE ...) non funzionano nelle query pass-through di Microsoft Access. Questo perché le tabelle temporanee in MySQL sono legate alla connessione che le ha create, mentre Access apre e chiude la connessione ogni volta che esegue una query pass-through, perdendo quindi la tabella temporanea.

    Nelle query PT uso tabelle temporanee caricate da un recordset ADO sulla base di un filtro complesso che non voglio ripetere in tutte le query di cui ho bisogno. In sostanza, una volta effettuata una selezione e salvate le chiavi in una TabTemp, poi mi basta mettere in join quella per parametrare le query PT, senza dover reinserire il filtro con relativi join. Pensa a una selezione dopo la quale puoi far partire la generazione di fogli excel, di report e altro a comando utente. Un a volta che hai la TT tutte le query sono indipendenti dal filtro originario. Devo usare una tabella temporanea per evitare i conflitti sulla multiutenza.

    Per risolvere il problema ho generato una tabella di servizio separata per ogni utente, il cui numero univoco ne costituisce il suffisso. Quindi ce n'è una per ogni utente. Per le query PT che creo a runtime compongo il nome della tabelle aggiungendo il numero utente, per quelle stabili verifico  l'sql alla partenza dell'applicativo ed eventualmente lo cambio. 

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - Catafirro ha scritto:

    No, le tabelle temporanee di MySQL (CREATE TEMPORARY TABLE ...) non funzionano nelle query pass-through di Microsoft Access. Questo perché le tabelle temporanee in MySQL sono legate alla connessione che le ha create, mentre Access apre e chiude la connessione ogni volta che esegue una query pass-through, perdendo quindi la tabella temporanea.

    Quando riesco, in questi giorni lo verifico ....

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - max.riservo ha scritto:

    Quando riesco, in questi giorni lo verifico ....

    Perchè ha ambito e vita solo nella connessione corrente. Chiusa quella connessione specifica, la tabella viene eliminata automaticamente e non è più fruibile dal resto del codice. 

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - By65Franco ha scritto:

    13/02/2025 - max.riservo ha scritto:

    Quando riesco, in questi giorni lo verifico ....

    Perchè ha ambito e vita solo nella connessione corrente. Chiusa quella connessione specifica, la tabella viene eliminata automaticamente e non è più fruibile dal resto del codice. 

    Sì, peccato. Access non ha una connessione stabile per le query PT. Apre e chiude.

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - max.riservo ha scritto:

    La tabella temporanea viene eliminata automaticamente alla chiusura della connessione quindi dovrebbe essere disponibile per le query utilizzando la stessa connessione.

    13/02/2025 - By65Franco ha scritto:

    Perchè ha ambito e vita solo nella connessione corrente. Chiusa quella connessione specifica, la tabella viene eliminata automaticamente e non è più fruibile dal resto del codice. 

    Questo l'avevo scritto ... probabilmente non era così evidente in mezzo a tutto il resto ; )

  • Re: Vantaggi MyISAM rispetto a InnoDb

    13/02/2025 - Catafirro ha scritto:

    Sì, peccato. Access non ha una connessione stabile per le query PT. Apre e chiude.

    Non sono così convinto ...

    Connessione globale, creazione della tabella temporanea e

    Dim sSql        As String
    Dim ArLog       As ADODB.Recordset
    
        If gAdoCnn.State = adStateClosed Then
            gAdoCnn.Open
        End If
        sSql = "Select * From QTOU"
        Set ArLog = gAdoCnn.Execute(sSql)
        If Not ArLog.EOF Then
            Debug.Print ArLog(0)
        End If

    La query viene eseguita restituendo il recordset. Non è una query PT come definita tramite DAO (ed usabile tramite l'oggetto QueryDef) però credo, magari sbagliando, che essendo connesso tramite una connessione globale ADO, la stessa query sia concettualmente assimilabile ad una query PT (ovvero eseguita sul server con la sintassi SQL prevista dal server) ... lascio però a chi fosse interessato fare ulteriori prove (e nel caso avesse voglia di condividere i risultati/commenti potrei sicuramente imparare qualcosa di nuovo). 

    La connessione rimane attiva fino a quando non la chiudo, chiudendo il programma.

    Forse, ripeto forse, non ho il problema perché ho le linked tables connesse al backend (tramite la connessione globale).

    Per scrupolo ho anche fatto creare tramite codice una query PT (DAO.querydef) : la creazione va a buon fine ma poi l'esecuzione restituisce errore (3146) come sembra ragionevole che sia.

    Ho anche provato a far eseguire una queryPT sempre tramite DAO senza però memorizzarla ed anche in questo caso ottengo errore :

    Dim db          As DAO.Database
    Dim Qdf         As DAO.QueryDef
    Dim Rs          As DAO.Recordset
    
        Set db = CurrentDb()
        Set Qdf = db.CreateQueryDef(vbNullString)   'Agisco su Query temporanea
        Qdf.Connect = "ODBC;" & ODBC_ConnectionString()	'Utilizzo la stssa stringa di connessione usata per creare la connessione globale
        Qdf.SQL = sSql
        Qdf.ReturnsRecords = True
        Set Rs = Qdf.OpenRecordset(dbOpenSnapshot, dbReadOnly)	'Errore runtime 3146
        If Not Rs.EOF Then
            Debug.Print Rs(0)
        End If

    13/02/2025 - Catafirro ha scritto:

    è possibile usare le tabelle temporanee mysql nelle query pass-throught di access?

    ChatGPT ha detto:

    No, le tabelle temporanee di MySQL (CREATE TEMPORARY TABLE ...) non funzionano nelle query pass-through di Microsoft Access. Questo perché le tabelle temporanee in MySQL sono legate alla connessione che le ha create, mentre Access apre e chiude la connessione ogni volta che esegue una query pass-through, perdendo quindi la tabella temporanea.

    Sul fatto che le tabelle temporanee sono legate alla connessione che le ha create concordo, sul fatto che l'esecuzione della query PT apra/chiuda una (nuova?) connessione non saprei rispondere. 

Devi accedere o registrarti per scrivere nel forum
11 risposte