jueves, 6 de noviembre de 2014

Extraer tablas con falta de indices.

Si requerimos extraer de una manera dinamica, a que campos de las tablas les falta crearles indice, podemos generarlo dando como parámetros la base de datos y el nombre o alias de campos.

En ocasiones nuestras reglas nos dicen que los campos que representan una llave foranea terminan con "_id", es asi que realizo la siguiente consulta


Consulta para extraer el query con la creación de indices para las tablas de una base de datos data, donde


SELECT CONCAT('CREATE INDEX ix_', a.table_name,'_',a.column_name, ' ON ',a.table_name,'(',a.column_name,')') as indice
FROM information_schema.columns as a INNER JOIN  information_schema.tables as b
ON a.table_schema = b.table_schema and a.table_name = b.table_name
WHERE a.table_schema = 'nombre_basedatos' and a.column_name like ('%_id') and b.table_rows > 1000 and column_key = '';


nombre_basedatos: La base de datos donde queremos revisar.
%_id: El alias de los campos que se estan buscando.

Dudas?

Tips optimización 1 MySQL

Lo primero que hay que revisar cuando queremos hacer una consulta mas rápida, es el 
uso de indices. 

Tips para Optimización de Consultas:

- Usar el comando EXPLAIN <consulta>, regresa información con respecto a la consulta.
- id: Numero secuencial de la consulta
- select_type: Tipo de consulta, los cuales pueden ser:
- SIMPLE: Consulta simple, sin subquerys.
- PRIMARY: Similar a la consulta simple.
- UNION: Segunda o tercera consulta dentro de una union. 
- DEPEDENT UNION: Similar a UNION.
- UNION RESULT: Resultado de la UNION.
- SUBQUERY: Primer subconsulta 
- DEPENDENT SUBQUERY: Similar a subquery 
- DERIVED: Subconsulta en una clausula FROM.
- table: Tabla a la que hace refernecia los registros.
- type: Tipo de join.
- system: Solo tiene un registro
- const:  
- eq_ref: 
- refref_or_null: 
- index_merge: 
- unique_subquery: 
- index_subquery: Es similar al unique_subquery, remplaza las subconsultas en IN, pero trabaja sobre indices no unicos.
- range: Solo los registros que fueron solicitaos son los que se regresan.
- index: Similar al "ALL", por lo general es mas rápido que el de ALL ya que se basa en el scaneo del arbol del indice. 
- ALL: Escaneo completo de la tabla.

- Suponiendo que tenememos una consulta con comparaciones entre campos, ya sea en un inner join ON, ó where, es importante mantener el mismo tipo de campos y padding en ambos. varchar(10) vs varchar(15) no es bueno, varchar(10) vs char(10) si lo es.

- En la clausula WHERE:
- Remover los parentecis inecesarios.
- Las constantes con indices se evaluan solo una vez.
- Count(*) sin WHERE, es obtenido de la información del cabcesero de la tabla.
- Para cada tabla en un join, 
- Las tablas constantes son leidas antes que cualquier otra tabla; las tablas constantes son, tablas vacias o con un solo registro, 
tablas que son usadas en WHERE en una llave primaria o unica.
-  La mejor forma de 

lunes, 13 de octubre de 2014

Comandos que JAMAS debes ejecutar Linuxs.

Comandos que jamas debes ejecutar en un ambiente #Linuxs.

Algunos comandos, unos comunes, que no deberías de ejecutar nunca, al menos que seas sumamente consciente de lo que estas haciendo, y aun así tampoco es buena idea.

"rm -rf /"
Al menos que quieras hacer una maldad, con este comando borrar todo recursivo y desde la raíz, si lo corres con un usuario con derechos, te podrás despedir de tu S.O.

"mv ~/dev/null"
Mover todo a ningún lugar, lo perderías todo.

"mkfs.ext3 /dev/sda"

Formatear el disco completo a una partición ext3:

"any-command > /dev/sda"

Enviar un comando a la salida del disco, perderías tu información.


lunes, 26 de mayo de 2014

Querys curiosos para MySQL

Manera de calcular el tamaño de cierta tabla, junto con eso, cantidad de registros, y el tamaño de los datos, del indice.

SELECT table_name, table_rows, data_length, index_length,
round(((data_length + index_length) / 1024 / 1024),2) "Size in MB",
(round(((data_length + index_length) / 1024 / 1024),2) / (SELECT COUNT(id) FROM nombre_basedatos.nombre_tabla)) as "Avg Row", (SELECT COUNT(id) FROM cbt.asociado) as rows FROM information_schema.TABLES WHERE table_schema = "nombre_basedatos"
and table_name = 'nombre_tabla';


Ver los derechos que tienen los usuarios sobre cierta base de datos:

SELECT grantee, privilege_type, is_grantable
  FROM information_schema.schema_privileges
  WHERE table_schema = 'nombre_basedatos';


Directorio en el que se encuentra nuestra base de datos:
SELECT @@basedir AS 'Directorio base';

Directorio donde se encuentran los datos.
SELECT @@datadir AS 'Directorio datos';

martes, 13 de mayo de 2014

Instalar mongodb

Comenzando con mongodb...

Instalación mongodb.

Descargar la versión de mongodb AQUI.

El archivo que se desempaque, lo hara por lo general a Donwload.

Lo desempacamos:

tar xvf ~/Downloads/mongodb-osx-x86_64-2.6.1.tar.gz

Entramos a la carpeta:
cd mongodb-osx-x86_64-2.6.1/

y listamos lo que se desempaco:
ls -lh

Entre muchas otras cosas, veremos 2 carpetas
mongo -> que es donde se encuentran los comandos ó shells
mongod -> que es donde esta el proceso del servicio del mongo

Nos cambiamos a usuario root (ó admin) y creamos la carpeta 
donde contendremos la base de datos y le otorgamos derechos

mkdir -p/data/db
cbmod 777 /data/db

Nos regresamos a nuestro usuario mortal e iniciaremos el servicio
./mongod

Aquí se finaliza la instalación de mongo, podemos hacer una prueba,
de que nuestro servicio esta levantado...

cd ~/Downloads/mongodb-osx-x86_64-2.6.1/bin/

./mongo

miércoles, 7 de mayo de 2014

Sublime 2.# Plugins


Package Control de Sublime Text 2

Hace un tiempo ya les había platicado sobre el editor (y mas que eso), Sublime Text 2, ahora les traigo un paquete que contiene y que no viene por defecto, Package Control, recomendadisimo..!!

Este es un controlador de paquetes (algo obvio el nombre), con el cual podremos instalar diferentes plugins para otorgarle diferentes utilidades y ayudas a los usuarios al manejar Sublime Text 2... es importante también caso contrario, no cargar de tantos plugins, ya que esto puede ocasionar lentitud, sin embargo hay unos plugins muy útiles.

Instalación de Package Control


  1. Abrimos Sublime Text 2 
  2. View > Show Console
  3. En la caja que aparesera, pegar el siguiente codigo: import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation' 
  4. Al final nos pedirá reiniciar Sublime Text.
  5. Una vez reiniciado, veremos en, Preferencias > Package Control.

Para instalar plugins, apartir de aquí, lo podremos hcaer con los comandos Shift + Ctrl + P. Aparecera una caja de texto donde escribiremos "Install Package", presionamos Enter, despues nos aparecera una lista para seleccionar elpaquete que nos interesa.


Algunos recomendados por mi son:
Aligment
FileDiffs
Git

Saludos, y disculpen si tardo en postear, pero a ratos ando por estos lados.



viernes, 21 de marzo de 2014

Actualizar #consecutivo a tabla #MySQL


Para actualizar un consecutivo,

Sin necesidad de realizar un ciclo, podemos actualizar un campo dado, comenzando con su maximo valor y que de ahi continue en consecutivo:

Creamos la tabla

CREATE TABLE tabla_prueba (id integer(4), valor varchar(40));

Insertamos registros a la tabla:
INSERT INTO tabla_prueba (id, valor) values(1,'valor1'),(2,'valor2'),(3,'valor3'),
       (0,'valor4'),(0,'valor5'),(0,'valor5');

Insertamos 3 registros con valor 0 en el campo id.

Actualizaremos esos registros que quedaron en 0, con un consecutivo.

UPDATE tabla_prueba as a, (SELECT @numeroConsecutivo:= (SELECT max(id) FROM tabla_prueba)) as tabla
SET a.id=@numeroConsecutivo:=@numeroConsecutivo+1 WHERE a.id = 0;


Cabe mencionar y como podrán observar que solo seleccione los campos con id = 0 para que se notara, si no, hubiera actualizado todos los registros con consecutivo a partir del 3, ya que era el máximo en su momento.