Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    Cardinalità indici: valori errati?

    Ho cercato su internet il significato di cardinalità din MySQL e mi sembra di aver capito che restituisce il numero di elementi distinti di quel campo.

    Verificando però alcune delle mie tabelle il valore non corrisponde. Dovrebbe infatti coincidere con un SELECT DISTINCT campo della tabella.

    Il motore è INNODB.

    Per cui 2 sono le ipotesi:

    1) non ho capito il significato di cardinalità
    2) c'è qualche ottimizzazione da fare sul db?

    Oppure?

    Grazie
    ciao

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Tieni conto che il numero di record per le tabelle innodb restituito dall'information_schema è approssimativo e potrebbe non coincidere con il valore esatto.
    Immagino che ciò si possa ripercuotere anche sulla cardinalità.

    Attendi comunque altri pareri. Potrei aver scritto una sciocchezza.

    edit.

    http://dev.mysql.com/doc/refman/5.0/en/show-index.html

    Cardinality

    An estimate of the number of unique values in the index. This is updated by running ANALYZE TABLE or myisamchk -a. Cardinality is counted based on statistics stored as integers, so the value is not necessarily exact even for small tables. The higher the cardinality, the greater the chance that MySQL uses the index when doing joins.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Il termine 'approssimativo' non è mai ben visto per un programmatore...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    e invece è inevitabile nel caso di engine con supporto transazionale.

    Il numero esatto delle righe di una tabella... non lo sa nessuno, in quanto puoi avere in un certo momento numerose transazioni che possono modificare le righe (aggiungerle, cancellarle) le quali, a loro volta, possono essere committate, oppure no, e perfino rollbackate.

    Ecco quindi che, semplicemente, count(qualcosa) non funziona mai in modo "veloce", se non nel caso di count(qualcosa) (tutto, senza where) in una tabella myisam.

    in tutti gli altri casi (innodb, ma anche myisam con WHERE) il count non fa altro che contare una per una le righe (o i valori).
    Attenzione che "righe" e "valori" non sono sinonimi in mysql.
    count(*) conta le righe.
    count(qualcosa) può contare le righe o i valori, se mysql si accorge che l'espressione non può mai essere null

    ---
    Ci sono vari "detti" su veloce, accurato e semplice per i count.
    Tipo prendine due

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.