Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    207

    [MySQL] Indici e loro utilizzo

    Ho una domanda da fare riguardo gli indici:
    se io ho una tabella con X campi di cui tre (CAMPO1, CAMPO2, CAMPO3) compongono la chiave primaria, MySQL crea un indice chiamato PRIMARY su questi tre campi.

    Ho creato poi un altro indice su CAMPO1 perché spesso faccio interrogazioni dove nella WHERE c'è solo CAMPO1.

    Se uso EXPLAIN vedo che MySQL usa l'indice PRIMARY invece dell'indice sul solo CAMPO1.

    E' inefficiente questo ai fini dei tempi di esecuzione?

  2. #2
    Utente di HTML.it L'avatar di Mashin
    Registrato dal
    Jul 2010
    Messaggi
    187
    MySql non lo conosco e forse sto per dire una assurdita, ma venendo da Oracle domando: non puoi forzare l'uso di un indice nell'esecuzione di una query ?

    in caso si potesse potresti provare a vedere i tempi di esecuzione con 1 indice piuttosto che l'altro.

    EDIT Guardando su http://database.html.it/guide/lezion...ttimizzazione/

    ho trovato questo spezzone che dovrebbe fare al caso tuo:

    Un modo di "suggerire" a MySQL di utilizzare un indice è quello di aggiungere la clausola FORCE INDEX nome_indice di seguito al nome della tabella nella SELECT."

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    207
    Grazie, non conoscevo questa clausola.
    Purtroppo, per me non funziona e mettendola non viene usato nessun indice. Mi scrive "Impossible WHERE noticed after reading const tables"...

  4. #4
    Utente di HTML.it L'avatar di Mashin
    Registrato dal
    Jul 2010
    Messaggi
    187
    Passo la palla ai MySqllisti esperti la mia era solo 1 idea

  5. #5
    La struttura dell'indice primary così come quella degli altri indici (anche con MyIsam) è B-Tree. Questa struttura nel caso di un indice primary dovrebbe consentire di utilizzare in maniera efficente le query che coinvolgono le colonne della primary key e in particolare se la prima colonna del where corrisponde alla prima delle colonne definite nell'indice. Quindi è inutile oltre che poco efficente in termini di performance aggiungere un nuovo indice.

    Anche la forzatura nell'utilizzo di un indice va fatta come eccezione alla regola o solo per fare dei test visto che l'engine è quello che ha quasi sempre ragione e se non usa un indice è perchè sulla base delle statistiche ritiene che sia meglio un full scan.

    In generale poi si può anche aggiungere che creare una chiave primaria composita fatta cioè dall'unione di più campi è una scelta che poi si riflette negativamente sulla pesantezza degli altri indici e sull'efficenza delle query di update. Questa scelta si potrebbe fare ad esempio quando la tabella viene utilizzata in gran parte per delle letture che utilizzano i campi della chiave primaria come filtro. Solitamente se si può scegliere si dovrebbe preferire una chiave artificiale gestita dall'engine ed eventualmente aggiungere indici unique se necessario.
    Saluti a tutti
    Riccardo

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 © 2020 vBulletin Solutions, Inc. All rights reserved.