martedì 4 ottobre 2011

MongoDB query e qualche test con indici

Utilizzando il db precedentemente creato eseguo qualche query per verificare la velocità:

db.freedb.disk.find({"artist":"Porcupine Tree"}).skip(0).limit(0)

324 risultati
92,81 secondi

Eseguo nuovamente la query precedente ed ottengo gli stessi tempi, quindi non si è creato una cache per la query.

Eseguo la stessa operazione dal codice java:



package freedbtoMongoDb;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;

public class Queries {

    static String host = "mongodb1";
    static int port = 27017;
    static String db_name = "freedb";

    public static void main(String[] args) {

        try {

            Mongo m = new Mongo(host, port);

            DB db = m.getDB(db_name);
            DBCollection coll = db.getCollection("disk");

            BasicDBObject query = new BasicDBObject();
            long t1 = System.currentTimeMillis();
            query.put("artist", "Porcupine Tree");


            DBCursor cur = coll.find(query).limit(0).skip(0);
            long t2 = System.currentTimeMillis();
            System.out.println("Tot time Find: " + (t2 - t1));

            while (cur.hasNext()) {
                System.out.println(cur.next());
            }
            long t3 = System.currentTimeMillis();
            System.out.println("Tot time cursor: " + (t3 - t2));

            m.close();

        } catch (Exception e) {

            System.out.println("Exception :" + e.getMessage());
        }
    }
}


Ottengo i seguenti risultati suddivisi per farte di find e retrive dei dati, da quello che si nota la lentezza è nel periodo di retrive dei dati.





Tot time Find: 2
{ "_id" : { "$oid" : "4e846f2330042d8d3130aad3"} , "id" : "blues_480f5d06" , "filename" : "blues/480f5d06" , "revision" : "7" , "title" : "The Sky Moves Sideways" , "genre" : "Rock" , "artist" : "Porcupine Tree" , "length" : "3935" , "year" : "1995" , "extd" : "YEAR: 1995 ID3G: 17" , "tracks" : { "3" : { "title" : "Prepare Yourself"} , "2" : { "title" : "The Moon Touches Your Shoulder"} , "1" : { "title" : "Dislocated Day"} , "0" : { "title" : "The Sky Moves Sideways (phase one)"} , "5" : { "title" : "The Sky Moves Sideways (phase two)"} , "4" : { "title" : "Moonloop"}}}}
etc..
etc..

Tot time cursor: 61270 (1 minuto abbondante)
BUILD SUCCESSFUL (total time: 1 minute 2 seconds)

adesso provo a restringere la query su determinati campi, ad esempio sul nome dell'album (field title).

db.freedb.disk.find({"artist":"Porcupine Tree"}, {title:1}).skip(0).limit(0)

con il terminale stesso risultato precedente:


324 risultati
92,81 secondi
con il seguente codice java:


package freedbtoMongoDb;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;

public class Queries {

    static String host = "mongodb1";
    static int port = 27017;
    static String db_name = "freedb";

    public static void main(String[] args) {

        try {

            Mongo m = new Mongo(host, port);

            DB db = m.getDB(db_name);
            DBCollection coll = db.getCollection("disk");

            BasicDBObject query = new BasicDBObject();


            query.put("artist", "Porcupine Tree");

            BasicDBObject field = new BasicDBObject();
            field.put("title", "1");

            long t1 = System.currentTimeMillis();
            DBCursor cur = coll.find(query, field).limit(0).skip(0);
            long t2 = System.currentTimeMillis();
            System.out.println("Tot time Find: " + (t2 - t1));

            while (cur.hasNext()) {
                System.out.println(cur.next());
            }
            long t3 = System.currentTimeMillis();
            System.out.println("Tot time cursor: " + (t3 - t2));

            m.close();

        } catch (Exception e) {

            System.out.println("Exception :" + e.getMessage());
        }
    }
}





Risultato:

Tot time Find: 1
{ "_id" : { "$oid" : "4e846f2330042d8d3130aad3"} , "title" : "The Sky Moves Sideways"}
{ "_id" : { "$oid" : "4e846f2330042d8d3130add5"} , "title" : "The Sky Moves Sideways"}
{ "_id" : { "$oid" : "4e846f2330042d8d3130bb1a"} , "title" : "The Sky Moves Sideways"}
{ "_id" : { "$oid" : "4e846f5830042d8d3134caaa"} , "title" : "BBC Sessions 1993 & 1995"}
{ "_id" : { "$oid" : "4e846faa30042d8d31379b9d"} , "title" : "XM ReTracked"}
{ "_id" : { "$oid" : "4e846fba30042d8d3138cc14"} , "title" : "Lightbulb Sun"}
etc.
etc.
etc.
Tot time cursor: 73556
BUILD SUCCESSFUL (total time: 1 minute 14 seconds)



Le tempistiche si mantengono molto vicine al precedente test anche con l'estrazione di un singolo campo.

A questo punto creo un indice semplice sul campo artist.

Eseguo nuovamente i test precedenti.

il primo:


console:
db.freedb.disk.find({"artist":"Porcupine Tree"}).skip(0).limit(0)

324 risultati tempo 0,01 s

in java:


Tot time cursor: 557

il secondo:


console:
db.freedb.disk.find({"artist":"Porcupine Tree"}, {title:1}).skip(0).limit(0)



324 risultati tempo 0,00 s

in java:

Tot time cursor: 63

diciamo che gli indici aiutano parecchio....



[sorgenti in NetBeans]



Nessun commento: