Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    240

    ottimizzazione query mysql

    Ciao ragazzi ho un dubbio circa l'ottimizzazione di una query.
    La query è una select con una clausola where.
    In questo caso correggetemi se sbaglio mysql scorre tutte le righe della tabella e seleziona le righe che soddisfano la condizione where per cui se ho una tabella con 6000 righe queste vengono analizzate una per una alla ricerca di quelle che soddisfano la clausola where.
    Questo comporta una notevole mole di lavoro...
    A questo proposito avevo pensato di ottimizzare la query utilizzando una clausola limit
    ma non so se la query è corretta.La query è la seguente:

    SELECT * FROM table ORDER BY id DESC LIMIT 50 WHERE campo='valore'

    Il mio dubbio è la detta query seleziona le ultime 50 righe della tabella e tra queste 50 verifica la clausola where(cosa che vorrei fare)
    oppure scorre tutta la tabella e si limita a riportare 50 righe che soddisfano la clausola where?

    Spero di essere stato chiaro.Ringrazio anticipatamente quanti risponderanno.
    Ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: ottimizzazione query mysql

    Originariamente inviato da illiterate
    Ciao ragazzi ho un dubbio circa l'ottimizzazione di una query.
    La query è una select con una clausola where.
    In questo caso correggetemi se sbaglio mysql scorre tutte le righe della tabella e seleziona le righe che soddisfano la condizione where per cui se ho una tabella con 6000 righe queste vengono analizzate una per una alla ricerca di quelle che soddisfano la clausola where.
    Questo comporta una notevole mole di lavoro...
    A questo proposito avevo pensato di ottimizzare la query utilizzando una clausola limit
    ma non so se la query è corretta.La query è la seguente:

    SELECT * FROM table ORDER BY id DESC LIMIT 50 WHERE campo='valore'

    Il mio dubbio è la detta query seleziona le ultime 50 righe della tabella e tra queste 50 verifica la clausola where(cosa che vorrei fare)
    oppure scorre tutta la tabella e si limita a riportare 50 righe che soddisfano la clausola where?

    Spero di essere stato chiaro.Ringrazio anticipatamente quanti risponderanno.
    Ciao
    vabbè direi che sei ai primissimi passi, ma non c'è problema.

    Se non esistono indici (o non sono utilizzabili) l'unica forma di ricerca è la full-scan, ossia la lettura riga-per-riga.
    La clausula LIMIT in questo caso non serve a nulla, o meglio ritorna al client solo le prime X righe prese (tra l'altro si scrive alla fine)
    ---
    Visto che usi una condizione di uguaglianza puoi, assai più semplicemente, definire un INDICE sul campo che vuoi usare come clausula WHERE; e magari pure uno nel campo che vuoi usare per ordinare

    SELECT * FROM table ORDER BY id DESC WHERE campo='valore'

    In questo caso ti conviene avere due indici, uno su id, ed uno su campo (in realtà potresti cavartela con un singolo indice combinato, ma non vorrei confonderti le idee).

    Questi due indici ti consentiranno di scegliere direttamente le foglie (o meglio pagine) che contengono le chiavi "campo=valore", e poi di ordinarle più facilmente.
    ---
    Attenzione: questo in teoria, perchè ci sono effetti collaterali
    1) ogni indice rende più lente le funzioni di aggiunta e modifica dei dati
    2) funzionano "bene" nel caso di condizioni = qualcosa, non funzionano per LIKE '%qualcosa%'
    3) - cosa spesso ignorata - dipendono dalla selettività
    Supponiamo di avere una tabella con 6000 righe, composte da 5999 campo="valore" e 1 sola "campo=pippo"

    la where campo="valore" indiciata, paradossalmente, è più lenta di una full scan, perchè il "costo" di interrogare l'indice per 5999 è decisamente più grande di quello di non interrogarlo neppure una volta

    viceversa la where campo=pippo viene eseguita quasi in tempo zero

    Il tema dell'ottimizzazione, ed in particolare per mysql, è uno dei più complessi, ma per livelli così semplici cerca "in giro", troverai caterve di suggerimenti

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    240
    Ciao grazie per il parere ,quello che mi premeva era ottimizzare lo script e in nottata ho trovato una soluzione abbastanza semplice e credo corretta.
    In pratica eseguiro una query sul db che mi estrae gli ultimi risultati della tabella

    SELECT * FROM table ORDER BY id DESC LIMIT 50

    in questo caso la query è ottimizzata in quanto il campo id con cui eseguo l ordinamento è una chiave primaria e quindi gia indicizzata da mysql

    dopodiche passero i valori estratti ad un array e su questo array faro i controlli che mi servono all interno di un ciclo for eliminando in tal modo la clausola where....

    Che ve ne pare?

    Grazie ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da illiterate
    Ciao grazie per il parere ,quello che mi premeva era ottimizzare lo script e in nottata ho trovato una soluzione abbastanza semplice e credo corretta.
    In pratica eseguiro una query sul db che mi estrae gli ultimi risultati della tabella

    SELECT * FROM table ORDER BY id DESC LIMIT 50

    in questo caso la query è ottimizzata in quanto il campo id con cui eseguo l ordinamento è una chiave primaria e quindi gia indicizzata da mysql

    dopodiche passero i valori estratti ad un array e su questo array faro i controlli che mi servono all interno di un ciclo for eliminando in tal modo la clausola where....

    Che ve ne pare?

    Grazie ciao
    cosa ti "turba" dall'inserire un indice sul campo dove vuoi mettere il where? Quasi sempre mysql è mooolto più veloce dei programmi che iterano sulle singole righe

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.