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

    Massimo 2 OR per un indice??

    Ciao a tutti,
    c'è una cosa che mi sta facendo impazzire alla quale non so darmi risposta.

    Ho una tabella con il campo "colori" per la quale ho creato un indice.
    Premetto che già dalle cardinalità noto che mysql, non so perchè, non mi indicizza bene questa chiave - che è varchar(30) non univoca -.

    Ovvero.

    Presuppondendo che il mio indice è fatto da tot colori:

    codice:
    giallo, verde, marrone, rosso, viola, azzurro.
    e che la mia tabella ha questi record:

    Paolo | giallo
    Marco | giallo
    Stefano | rosso
    Valeria | viola

    La cardinalità corretta dell'indice che dovrei vedere (anche dopo aver ottimizzato la tabella) sarebbe 3, ma io vedo 4.

    Va beh, strano. Ma andiamo avanti.

    Ora se faccio una query con l'explain esempio

    Codice PHP:
    explain
    SELECT 
    FROM tabella where colore 'giallo' or colore 'rosso' order by utente 
    Lui mi dice che ha effettivamente usato l'indice del colore e ha quindi scansionato solo 2 righe. Bene.

    Ma se all'OR ne aggiungo un'altra tipo
    Codice PHP:
    explain
    SELECT 
    FROM tabella where colore 'giallo' or colore 'rosso' or colore 'viola' order by utente 
    l'explain dice che seppur l'indice c'è ha dovuto scansionare tutta la tabella

    codice:
    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
    1 SIMPLE miatabella ALL tag NULL NULL NULL 11 Using where
    Ma perchè??

    Eppure ho diverse tabelle "settate" in modo praticamente uguale, in cui, mettendo anche 10 OR, la scansione della tabella viene eseguita seguendo correttamente l'indice.

    C'è un motivo?? :master: :master:

    Grazie mille
    Perchè uso Maxthon? | Mi piace questa chat

  2. #2
    Ho appena provato a cancellare la tabella e rifarla daccapo, ma il problema rimane.

    :master:
    Perchè uso Maxthon? | Mi piace questa chat

  3. #3
    Puoi provare a fare un ANALYZE sulla tabella e vedi se cambia il comportamento dell'optimizer di mysql, se non cambia niente puoi forzare manualmente l'uso dell'indice:

    codice:
    EXPLAIN
    SELECT * FROM tabella
    FORCE INDEX (colore)
    WHERE colore = 'giallo'
       OR colore = 'rosso'
       OR colore = 'viola'

  4. #4
    Ciao k.b.
    col force index funziona bene!

    Sono stato stupido.
    Già ho usato il force index per altre query e ieri la prima cosa che sono andato a cercare era proprio documentazione su quest'ultimo.

    Mysql fa switchare tutto su USE INDEX anzichè il FORCE INDEX, quindi provavo con USE INDEX... non considerando il fatto che ho si mysql 5, ma non la 5.1 dove evidentemente è supportato l'USE INDEX a cui la documentazione fa riferimento.

    Insomma, una svista che si è risolta nel migliore dei modi.
    Colpa mia, avrei dovuto provare il FORCE.
    Grazie ancora.
    Perchè uso Maxthon? | Mi piace questa chat

  5. #5
    Comunque considera che
    Sometimes MySQL does not use an index, even if one is available. One circumstance under which this occurs is when the optimizer estimates that using the index would require MySQL to access a very large percentage of the rows in the table. (In this case, a table scan is likely to be much faster because it requires fewer seeks.)
    http://dev.mysql.com/doc//refman/5.0...l-indexes.html

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