• User

    come si utilizzano gli indici?

    ciao,
    ho letto ora cercando su internet che uno dei modi per velocizzare le interrogazioni dal db è quello di utilizzare gli indici.

    Pubblico una tipica query che utilizzo di solito, mi dite se in questa query ho utilizzato degli "indici"?

    [PHP]
    SELECT d_corsi., d_corsi_file., d_corsi_file.id_corsi_file AS id_corsi_file2, a_login., a_anagrafica., DATE_FORMAT(d_corsi_file.data_ins_adm, '%d-%m-%Y') AS data_ins_adm2
    FROM d_corsi INNER JOIN d_corsi_fileON d_corsi.id_corsi = d_corsi_file.id_corsi INNER JOIN a_login ON d_corsi_file.id_login_ins_adm = a_login.id_login
    INNER JOIN a_anagrafica ON a_login.id_anagrafica = a_anagrafica.id_anagrafica AND d_corsi_file.id_corsi = '".$idcorsi."' AND d_corsi_file.id_corsi_file > '3'ORDER BY d_corsi_file.id_corsi_file DESC[/PHP]

    SELECT d_corsi.,
    d_corsi_file.
    , d_corsi_file.id_corsi_file AS id_corsi_file2,
    a_login., a_anagrafica.,

    DATE_FORMAT(d_corsi_file.data_ins_adm, '%d-%m-%Y') AS data_ins_adm2

    FROM d_corsi

    INNER JOIN d_corsi_file
    ON d_corsi.id_corsi = d_corsi_file.id_corsi

    INNER JOIN a_login
    ON d_corsi_file.id_login_ins_adm = a_login.id_login

    INNER JOIN a_anagrafica
    ON a_login.id_anagrafica = a_anagrafica.id_anagrafica

    AND d_corsi_file.id_corsi = '".$idcorsi."'
    AND d_corsi_file.id_corsi_file > '3'
    ORDER BY d_corsi_file.id_corsi_file DESC

    Grazie


  • User

    Se non sbaglio in una query te usi il campo id_corso, contenete un id, quello é un modo per indicizzare la tabella.

    Se ad esempio vuoi recuperare un determinato recordo, senza scanzionare tutta la tabella record per record di basta utilizzare la clausora WHERE seguida dalla condizione di selezione.

    Oltre a velocizzare il tutto se metti il risultato di quella query ( un record ) all'interno di una variabile occupi meno spazio di memoria che con una variabile contenente piú record ( piú grante )


  • User

    Ciao Sevenjeak,

    @Sevenjeak said:

    Se non sbaglio in una query te usi il campo id_corso, contenete un id, quello é un modo per indicizzare la tabella.

    Se ad esempio vuoi recuperare un determinato recordo, senza scanzionare tutta la tabella record per record di basta utilizzare la clausora WHERE seguida dalla condizione di selezione.

    Allora questo lo sto già facendo

    @Sevenjeak said:

    Oltre a velocizzare il tutto se metti il risultato di quella query ( un record ) all'interno di una variabile occupi meno spazio di memoria che con una variabile contenente piú record ( piú grante )

    Questo invece non l'ho capito, mi potresti per favore fare un esempio?
    Grazie


  • User

    incollo un estratto preso da un'altro sito, riusciresti a spiegarmi in parole semplici la differenza tra questi indici?

    • primary key (o chiavi primarie): questo tipo di indice consente di identificare univocamente e direttamente ogni singolo record all'interno di una tabella; solitamente si utilizza un campo numerico intero con AUTO_INCREMENT per creare la chiave primaria: così facendo ogni record ha un suo "numero" attraverso il quale è possibile accederlo univocamente.
    • unique: è simile al precedente nel senso che non vi possono essere valori duplicati all'interno della colonna, tuttavia ammette anche valori NULL.
    • index o key: sono degli indici non univoci, questo vuol dire che ammettono anche valori duplicati; il loro scopo esclusivo è di aumentare la velocità di accesso ai record mediante selezioni che non riguardano la chiave primaria.
    • fulltext: questo tipo di indice è supportato esclusivamente dalle tabelle di tipo MyISAM e consente di effettuare, rapidamente, ricerche all'interno di grandi volumi di dati testuali mediante le clausole MATCH() / AGAINST(). In sostanza, questo tipo di indice può essere utilizzato per crearea una sorta di "Google" interno grazie al quale effettuare ricerche naturali tra i contenuti archiviati nel DB. Questo tipo di indice può riguardare esclusivamente campi di tipo CHAR, VARCHAR e TEXT.

    comunque quello che forse è più mi interessa è il index o key: perchè pare che velocizzi l'interrogazione del db, ma come si implementa?


  • User

    forse ho trovato quello che cercavo, devo solo approfondire come utilizzarlo:

    w w w . siteground . it / kb/ottimizzazione-mysql-usando-indici/


  • User

    Se non sbaglio la cosa dovrebbe essere gestita dal DBMS.ti dovrebbe bastare una semplece SELECT con la clausola WHERE.

    Ad esempio esequendo questa select

    SELECT nome, cognome WHERE nome = "mario"
    

    Se il cambo nome é un indice, il DBMS, dovrebbe recuperarlo piú rapidamente, anche se non ti assicuro niente, puoi tutta via, verificare ció utilizzando un EXPREIN sulla query

    In caso contrario non saprei che dirti, purtroppo io ho sempre e solamente usato l'indice Primary_key ( visto che é univoco ho sempre usato quello e mai gli altri )

    @Sevenjeak said:

    Oltre a velocizzare il tutto se metti il risultato di quella query ( un record ) all'interno di una variabile occupi meno spazio di memoria che con una variabile contenente piú record..
    Se ad esempio hai questo codice:

    
    $query = mysqli_query(..);
    $result = mysqli_fetch_array($query);
    
    

    Se ad esempio al posto dei puntini metto una select senza clausola WHERE la variabile $result conterrá un'array contenente tutti i record della tabella, variabile che cosi facendo occuperebbe piú spazio in memoria, ma come giá detto questo non centra niente con l'ottimizzazione della query, ma con il risparmio di memoria.


  • User

    Ok grazie Sevenjeak