Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Fragmentacion de tablas en mysql

Estas en el tema de Fragmentacion de tablas en mysql en el foro de Mysql en Foros del Web. Buenas tardes! Tengo una duda. ¿Como puedo fragmentar una tabla en MySql?. Se que en otros motores, como informix, yo puedo fragmentar por distintos metodos ...
  #1 (permalink)  
Antiguo 06/07/2011, 15:43
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Fragmentacion de tablas en mysql

Buenas tardes!

Tengo una duda. ¿Como puedo fragmentar una tabla en MySql?.

Se que en otros motores, como informix, yo puedo fragmentar por distintos metodos (fragmentacion, circular, hash, etc). Esto con la finalidad de que una tabla pueda ser "dividida" de manera predefinida.

Cuando uno lanza una consulta, el motor decide que espacio debe de leerse, o bien, levantar "n" hilos para que la peticion sea atendida. Esto agiliza mucho las consultas, y quisiera saber si hay algo similar (o algun truco a aplicar para simular esto) dentro de mysql.

Tengo una tabla:
CREATE TABLE `cel_estadistica` (
`idestadistica` int(11) unsigned NOT NULL auto_increment,
`idoperador` int(11) unsigned NOT NULL COMMENT 'Llave primaria de la tabla.',
`idnumerocorto` int(11) unsigned NOT NULL COMMENT 'Llave del catalogo',
`idservicio` int(11) unsigned NOT NULL,
`movil` char(13) collate utf8_spanish_ci NOT NULL,
`activo` char(1) collate utf8_spanish_ci NOT NULL,
`fechahora` datetime NOT NULL,
`error` varchar(200) collate utf8_spanish_ci default NULL,
`ahora` datetime default NULL,
PRIMARY KEY (`idestadistica`),
KEY `idx_esatistica_movil` (`movil`),
KEY `idx_estadistica_fechahora` (`fechahora`),
KEY `idx_estadistica_idoperador` (`idoperador`),
KEY `idx_estadistica_idservicio` (`idservicio`),
KEY `idx_estadistica_activo` (`activo`),
KEY `fk_numerocorto_estadistica` (`idnumerocorto`)
) ENGINE=MyISAM AUTO_INCREMENT=2142829 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

mysql> show indexes from cel_estadistica;
+-----------------+------------+----------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+----------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| cel_estadistica | 0 | PRIMARY | 1 | idestadistica | A | 2142827 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_esatistica_movil | 1 | movil | A | 26785 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_fechahora | 1 | fechahora | A | 66963 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_idoperador | 1 | idoperador | A | 2 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_idservicio | 1 | idservicio | A | 1 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_activo | 1 | activo | A | 1 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | fk_numerocorto_estadistica | 1 | idnumerocorto | A | 2 | NULL | NULL | | BTREE | |
+-----------------+------------+----------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+

Al lanzar la consulta:
select count(distinct cel_estadistica.movil) as unicos,
count(*) cantidad,
cel_estadistica.idoperador,
cel_operador.nombre,
date(cel_estadistica.fechahora) fecha
from cel_operador, cel_servicio, cel_estadistica
where cel_estadistica.idservicio = cel_servicio.idservicio and
cel_estadistica.idoperador = cel_operador.idoperador and
cel_estadistica.fechahora <= NAME_CONST('pidt_fechatermino',_binary'2011-07-30 23:59:59' COLLATE 'binary') and
cel_estadistica.fechahora >= NAME_CONST('pidt_fechainicio',_binary'2011-01-01 00:00:00' COLLATE 'binary') and
cel_servicio.activo = 'S' and
cel_operador.usosms = 'S' and
cel_operador.idpais = NAME_CONST('pil_idpais',1)
group by 3, 4, 5;

llega a tardarse mas de lo "normal".
El explain:
+----+-------------+-----------------+--------+---------------------------------------------------------------------------------+---------+---------+----------------------------------------+---------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+--------+---------------------------------------------------------------------------------+---------+---------+----------------------------------------+---------+-----------------------------+
| 1 | SIMPLE | cel_estadistica | ALL | idx_estadistica_fechahora,idx_estadistica_idoperad or,idx_estadistica_idservicio | NULL | NULL | NULL | 2142827 | Using where; Using filesort |
| 1 | SIMPLE | cel_servicio | eq_ref | PRIMARY | PRIMARY | 4 | estadistica.cel_estadistica.idservicio | 1 | Using where |
| 1 | SIMPLE | cel_operador | eq_ref | PRIMARY,fk_celpais_operador | PRIMARY | 4 | estadistica.cel_estadistica.idoperador | 1 | Using where |
+----+-------------+-----------------+--------+---------------------------------------------------------------------------------+---------+---------+----------------------------------------+---------+-----------------------------+

La tabla no esta usando el indice en la fecha, esto quiza se deba a que el optimizador detecte que no hay mucho provecho el usar este indice ya que la cardinalidad es "baja"
+-----------------+------------+----------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+----------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| cel_estadistica | 0 | PRIMARY | 1 | idestadistica | A | 2142827 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_esatistica_movil | 1 | movil | A | 26785 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_fechahora | 1 | fechahora | A | 66963 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_idoperador | 1 | idoperador | A | 2 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_idservicio | 1 | idservicio | A | 1 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | idx_estadistica_activo | 1 | activo | A | 1 | NULL | NULL | | BTREE | |
| cel_estadistica | 1 | fk_numerocorto_estadistica | 1 | idnumerocorto | A | 2 | NULL | NULL | | BTREE | |
+-----------------+------------+----------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+


Si yo lograse "partir" la tabla es mas sencillo que se levante un hilo por "fragmento" y obvio seria mucho mas rapido.

Alguna idea de que hacer?

NOTA: Les deje todos los datos que crei convenientes, en caso de que requieran alguno mas solo pidanmelo.

Muchisimas gracias.
  #2 (permalink)  
Antiguo 06/07/2011, 18:24
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Fragmentacion de tablas en mysql

Yo intentaria pasar los parametros que quiero que incluya por php.

O sea SELECT $variable FROM tabla WHERE $condicion

De esa manera podes limitar la consulta.

Sino otra cosa que se me ocurre es crear tablas temporales con la info que necesitas pero es basicamente lo mismo (creo)

Saludos...

Etiquetas: fragmentar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:10.