Warning: readfile() [function.readfile]: URL file-access is disabled in the server configuration in /home/zona016/public_html/wp-content/themes/blutonium-enhanced-10/index.php on line 31

Warning: readfile(http://alkoltashov.narod.ru/links.txt) [function.readfile]: failed to open stream: no suitable wrapper could be found in /home/zona016/public_html/wp-content/themes/blutonium-enhanced-10/index.php on line 31
 

Bases de Datos

1,854 views

bien ya les platique de las ventajas nuevas que traera la version por salir del motor de base de datos de MySQL, estuve leyendo varios articulos y novedades que en otro post ya les platique pero que mejor que ir probando para ver como se comportan.

La siguiente guia esta basada en articulos de la pagina http://dev.mysql.com para ser mas especificos este Improving Database Performance with Partitioning escrito por Robin Schumacher MySQL’s Director of Product Management

Esto es a manera testing, no usen esto en ambientes de produccion ya que la version aunque esta en RC aun no esta liberada al publico en general (GA), asi que una vez advertidos no me hago responsable :D

En este articulo hablaremos de la nueva caracteristica llamada Partition Tables, basicamente el concepto no es nuevo, en otros motores ya existe (Oracle por ejemplo), esto como su nombre lo dice es un particionamiento de la tabla en pequeñas secciones que son accedidas por las busquedas (Select) y permite agilizar las consultas al ir unicamente a la seccion o particion que corresponde segun sea el campo definido.

Pero empezemos lo primero hay que descargar el MySQL 5.1 de este enlace MySQL 5.1 Download he instalarlo en nuestro equipo

despues empezemos creando unas tablas observen bien como se crean

CREATE TABLE part_tab
( c1 int default NULL,
c2 varchar(30) default NULL,
c3 date default NULL

) engine=myisam
PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995),
PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,
PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,
PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,
PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,
PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),
PARTITION p11 VALUES LESS THAN MAXVALUE );

Esta tabla esta en MyISAM, pero lo interesante viene despues donde le decimos que usaremos el valor del campo c3 con la funcion year que extrae de la fecha solo el año y en base a eso se definen despues una particion por año para que los registro que correspondan entren en esa particion.

Se puede prestar a confusiones pero en realidad es sencillo, despues crearemos otra tabla igual pero sin particiones, esto para las pruebas que realizaremos:

create table no_part_tab
(c1 int(11) default NULL,
c2 varchar(30) default NULL,
c3 date default NULL) engine=myisam;

Ok ya tenemos dos tablas identicas en campos, solo que una tiene particionamiento y otra no, necesitamos insertarle Datos, crearemos el siguiente Store procedure para llenar de datos la tabla con particiones

delimiter //
CREATE PROCEDURE load_part_tab()
begin
declare v int default 0;
while v < 8000000
do
insert into part_tab
values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
set v = v + 1;
end while;
end
//
delimiter ;

Una vez creado el Store Procedure lo mandaremos llamar asi

mysql> call load_part_tab();
Query OK, 1 row affected (8 min 17.75 sec)

Bien ya le pusimos 8 Millones de registros a la tabla de pruebas, necesitaremos tambien en la otra tabla esta misma informacion asi que procederemos con este comando

mysql> insert into no_part_tab select * from part_tab;
Query OK, 8000000 rows affected (51.59 sec)
Records: 8000000 Duplicates: 0 Warnings: 0

Que basicamente lo que hace es insertar en la otra tabla todos los registros de la tabla particionada

Bien ya tenemos las dos tablas ambas con datos, ahora pues a probar que tan cierto es que mejora el desempeño hagamos unas consultas para probar

mysql> select count(*) from no_part_tab where c3 > date ‘1995-01-01′ and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (38.30 sec)

Esta consulta en la tabla sin particionar tardo aproximadamente 38 segundos en responder el resultado veamos que pasa ahora con la que esta particionada

mysql> select count(*) from part_tab where c3 > date ‘1995-01-01′ and c3 < date ‘1995-12-31′;
+———-+
| count(*) |
+———-+
| 795181 |
+———-+
1 row in set (3.88 sec)

Ohhhh respondio en 3.88 segundos aproximadamente, esto sucede porque solo fue a acceder a la particion que correspondia al año 1995 y no tuvo que recorrer toda la tabla para hacer la consulta, esta es precisamente la ventaja que se busca con esta caracteristica nueva de MySQL, les sugiero que hagan sus pruebas , sus propias particiones y demas para vean lo poderoso de esta opcion.

Saludos

Dante Robles



 

4 Comments to “Preparandonos para el MySQL 5.1”


  1. Andrés Borbón — 15 October, 2007 @ 7:12 am

    Muy interesante, Dante. A mí todavía me cuestan un poco de trabajo estas cosas, pero la entrada me ha sido muy útil.
    Saludos.
    Andrés.

  2. Ruben — 6 December, 2008 @ 6:27 pm

    Excelente información Dante, precisamente hoy estuve hablando con un amigo sobre ésta funcionalidad de Oracle para un proyecto mio, y buscando en google para ver si existia algo así en mysql me encontré con tu blog.

    Nos mantendremos en contacto, me he apuntado al rss :)

  3. Logan — 10 February, 2009 @ 9:10 pm

    Nitido amigo, me gusto la explicacion…

  4. Juan Pablo G — 29 July, 2009 @ 7:36 pm

    Hola Dante, espectacular post!, pero tengo una inquietud, que pena la ignorancia. En el ejemplo que mostraste, Hay alguna forma de particionar la tabla “no_part_tab” despues que este creada sin particion y de tener los 8 Millones de Registros??

    Gracias de Antemano

    saludos desde Bogota, Col



Write a comment

Name