Uso de Maatkit para detectar índices duplicados en MySQL
El Maatkit es un conjunto de utilidades para la administración de MySQL. Una de ellas permite buscar los indices duplicados para una base de datos en concreto.
Para obterner dicha utilidad lo podemos hacer mediante el siguiente wget:
# cd /usr/local/bin # wget http://www.maatkit.org/get/mk-duplicate-key-checker # chmod +x mk-duplicate-key-checker
Si no los teneis ya instalados, necesitareis los siguientes modulos de perl:
- DBD::mysql
- Term::ReadKey
Se pueden instalar mediante cpan (recortanda la salida):
# cpan Terminal does not support AddHistory. cpan shell -- CPAN exploration and modules installation (v1.7602) ReadLine support available (try 'install Bundle::CPAN') cpan> install Term::ReadKey (...) cpan> install DBD::mysql (...)
A continuación ya se puede ejecutar mk-duplicate-key-checker así:
$ mk-duplicate-key-checker --user maite --askpass --host 172.12.1.130
Su salida sería similar a esta:
DATABASE TABLE ENGINE OBJECT TYPE STRUCT PARENT COLUMNS site32 zzzta_9 MyISAM PRIMARY KEY BTREE NULL `ta_id` site32 zzzta_9 MyISAM ta_id KEY BTREE NULL `ta_id` site32 zzzta_9 MyISAM ta_id_2 KEY BTREE NULL `ta_id`
Para este caso veriamos no un índice duplicado, sinó triplicado. Podemos ver su create table:
mysql> show create table zzzta_9\G
*************************** 1. row ***************************
Table: zzzta_9
Create Table: CREATE TABLE `zzzta_9` (
`ta_id` int(11) unsigned NOT NULL auto_increment,
`ta_section` varchar(100) default NULL,
`ta_url` text,
`ta_keywords` text,
`ta_description` text,
PRIMARY KEY (`ta_id`),
UNIQUE KEY `meta_id` (`ta_id`),
KEY `meta_id_2` (`ta_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Vemos como el desarrolador ha definido:
- Un índice para el campo ta_id mediante la keyword KEY
- A continuación una restricción UNIQUE, por lo que se crea un índice implicatamente restringuiendo la columna a valores únicos incluyendo NULL como possible valor.
- Finalmente, define la columna como PRIMARY KEY, creando el tercer índice y restringiendo a valores únicos excluyendo NULL
Este tipo de errores són más comunes de lo que parece. Además los desarrolladores acostumbran a ser reticentes a quitar estos índices, incluso si estan triplicados. Para este caso sólo con la PRIMARY KEY sería suficiente.
Otro caso común sería el siguiente:
site53 areas MyISAM area_pt KEY BTREE NULL `area_pt` site53 areas MyISAM area_pt_name KEY BTREE NULL `area_pt`,`area_name`
En este caso vemos que el índice area_pt es prefijo del índice area_pt_name. MySQL puede usar cualquier prefijo possible de un índice multicolumna, por lo que el índice area_pt se puede eliminar, ya que MySQL podría usar el índice compuesto en su lugar.
Relacionados
Imprimir
Deja un comentario: