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.