DAW Desenvolupament d'aplicacions web ( Informàtica )
Exercici de DAW-MP02-UF4 - Bases de dades objectes-relacionals

#FpInfor #Daw #DawMp02 #DawMp02Uf04

(etiquetes - hashtags)
Cassandra vs MySQL

Un cop instal·lat cassandra anem a fer un exercici de comparació d'inserció de un milió de tuples a la base de dades, insertarem a Cassandra i farem el mateix a MySQL.

Pas 1) Anem a crear les taules:

DDL MySQL:

mysql> create table pintura (
    -> id int primary key,
    -> producte int,
    -> color int,
    -> preu int);
Query OK, 0 rows affected (0.24 sec)

mysql> create index i2 on pintura(producte);
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index i1 on pintura(color);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

DDL for cassandra:

cqlsh:mykeyspace> create table pintura (
              ... id int primary key,
              ... producte int,
              ... color int,
              ... preu int);
cqlsh:mykeyspace> create index i1 on pintura (producte);
cqlsh:mykeyspace> create index i2 on pintura (color);

Pas 2) Preparem script per insertar dades, usarem python cql per insertar a cassandra:

Cassandra script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/python

import cql
import random

db = cql.connect('localhost', 9160,  'mykeyspace', cql_version='3.0.0')
cursor = db.cursor()
for i in range( 1000000 ):
    producte = random.randint( 0,100 )
    color = random.randint( 0,100 )
    preu = random.randint( 100,1000 )

    cursor.execute('''INSERT INTO pintura (id, producte, color, preu)
                      VALUES (%s, %s, %s, %s)''' % (i, producte, color, preu))

    # Commit your changes in the database
    db.commit()

# disconnect from server
db.close()

Mysql script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/python

import MySQLdb
import random

# Open database connection
db = MySQLdb.connect("localhost","root","pass","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

#SQL query to INSERT a record into the table prova.
for i in range( 1000000 ):
    producte = random.randint( 0,100 )
    color = random.randint( 0,100 )
    preu = random.randint( 100,1000 )

    cursor.execute('''INSERT INTO pintura (id, producte, color, preu) 
                      VALUES (%s, %s, %s, %s)''' % (i, producte, color, preu))

    # Commit your changes in the database
    db.commit()

# disconnect from server
db.close()

Times:

cc@cc-cc:~/x$ time python insert_mysql.py

real        ??m??.???s
user        ??m??.???s
sys         ??m??.???s

cc@cc-cc:~/x$ time python insert_cassandra.py

real        ??m??.???s
user        ??m??.???s
sys         ??m??.???s

Exercici

  • Realitza aquestes proves al teu ordinador i mira a quina base de dades el python inserta més ràpid.
  • Repeteix les proves, però en aquesta ocasió, en comptes d'insertar directament des de python, genera un fitxer .sql amb les comandes de seleccionar bd (o keyspace) i inserts preparades i executa'l des de la shell dels diferents SGBD. Per exemple, time cqlsh -3 < inserts_cassandra.sql, time mysql -u root -p < inserts_mysql.sql.
  • Llegeix el post How not to benchmark Cassandra i valora les proves que has fet.
  • Consulta quantes fileres s'han insertat a cada taula, recorda ampliar el límit quan fàcis la consulta a cassandra ( select count(*) from taula limit 9999999; )
  • Consulta quantes dades hi ha per color = 1 i producte = 1
  • Pots consultar a cassandra quantes dades hi ha amb preu = 200? Per què?

Ampliació:

Segueix les instruccions de dataStax per a:

Repeteix les proves connectant-te ara al cluster creat:

from cassandra.cluster import Cluster
cluster = Cluster(['192.168.1.1', '192.168.1.2'])
session = cluster.connect()
...
cluster.shutdown()
Resultats d'aprenentatge:
Continguts:

Editat 30 de abril de 2014 a les 18:34
per daniel herrera

Pujat el 25 de abril de 2014 a les 17:19
per daniel herrera

Consulteu nota legal i condicions