Inserindo índices automaticamente nos relacionamentos
Durante o desenvolvimento de uma aplicação legada, percebi que muitos gastos do banco de dados era devido a falta de índices nas tabelas do banco de dados.
Para não criar todos os índices na mão resolvi desenvolver um shell para o cakephp que os insira sempre que um relacionamento for detectado.
O script pode ser encontrado aqui no meu github.
Segue o código para quem não trabalha com git:
<?php App::import('Model'); class InsertIndexShell extends Shell { public function main() { $models = $this->getModels(); $this->insertIndexes($models); } private function getModels() { return App::objects('model'); } private function insertIndexes($models) { foreach($models as $model) { App::import('Model',$model); $this->{$model} = new $model(); $this->{$model}->recursive = -1; $this->fieldsToIndex($this->{$model}); } } private function fieldsToIndex($modelObj) { foreach($modelObj->belongsTo as $relacionamento) { $field = $modelObj->_schema[$relacionamento['foreignKey']]; if(!empty($field) && !array_key_exists('key',$field)) { if($modelObj->query("ALTER TABLE `{$modelObj->tablePrefix}{$modelObj->table}` ADD INDEX (`{$relacionamento['foreignKey']}`)")) { $this->out("Indice {$relacionamento['foreignKey']} adicionado em {$modelObj->table}"); } else { $this->out("impossivel adicionar indice {$relacionamento['foreignKey']} em {$modelObj->table}"); } } } } } ?>
Obs1.: Está específico para o MySQL.
Obs2.: Na próxima versão verificarei as colunas que estão sendo utilizadas nos conditions.




