Comparativa base de datos en entornos Cloud

Después de trabajar muchos años con herramientas de diferentes cloud (Google, Amazon y recientemente con Azure) en este artículo preparo una comparativa de base de datos en los entornos Clouds más potentes, incluyendo Snowflake que desde hace unos años viene pisando muy fuerte con sus soluciones así como sus alianzas y capacidades de conexión entre todos los clouds.

Comparativa base de datos: Google BigQuery

Google BigQuery es un servicio de almacenamiento de datos gestionado en la nube. Se abstrae de las configuraciones y de los detalles de hardware y base de datos, es serverless y gestiona almacenamiento y recursos de forma dinámica.

Se denomina una base de datos “hands-off”, sin índices o restricciones por columnas.

Como principales puntos a favor para la comparativa de base de datos podemos mencionar que la configuración de este servicio es super sencilla y rápida.

Otros puntos destacados serían:

  • La ingesta de datos no tiene impacto directo en el rendimiento de las queries ya que los recursos computacionales se usan de forma individual para cargar o para llevar a cabo las extracciones de los usuarios.
  • Capacidad de exportar en diferentes formatos.
  • El modelo de princing, no se realiza por ingestas sino por procesamiento de datos.
  • Permite la ingesta de datos con esquemas desconocidos con la opción “sugerencia de ingesta”
  • No necesita gestión supervisada (fully-managed)

Como puntos en contra podemos mencionar que el usuario no puede definir nodos o capacidad de la instancia BigQuery.

Otros serían:

  • No posee soporte de almacenamiento de ficheros.
  • No permite que los resultados de las queries excedan los 128MB.
  • Servicio global (multi-región) que no cuenta con transparencia en cuanto a zonas de disponibilidad o regiones.
  • Soporte limitado de logging para gestión de cuentas, seguridad y aprovisionamiento.
Puntuación en las review de mercado de Garnet de 4.6

Comparativa base de datos: Microsoft Azure SQL Data Warehouse

Microsoft Azure SQL Warehouse es una base de datos  empresarial capaz de gestionar grandes cantidades de datos, tanto relacionales como no relacionales. La BBDD es ANSI-SQL y se basa en un modelo columnar de los datos.

Se integra con la familia de servicios de SQL Server y de Azure (Azure Data Lake Storage, Data Factory, HDInsight, Databricks, etc.)

Como principales puntos a favor para la comparativa de base de datos podemos destacar que es independiente de la unidad de almacenamiento, lo que permite escalar recursos computacionales y capacidad de almacenamiento de manera individual.

Otros puntos destacados son:

  • Tiene una interfaz muy friendly lo que facilita las tareas de configuración. Debido a la simplicidad de su interfaz la hace muy cómoda la experiencia de usuario.
  • Integrable con herramientas de BI como Datometry, Qlik, MicroStrategy, Informatica, Talend, Tableau, PowerBI, etc.
  • Permite exportar datos a ficheros locales y viceversa, de manera sencilla como se haría con SQL Server.
  • Soporta hasta 128 queries simultáneas.
Puntuación en las review de mercado de Garnet de 4.7

Como puntos en contra podemos mencionar que lleva mucho tiempo el mantenimiento y la adaptación de la infraestructura a nuevos releases de los servicios.

Otros puntos a mencionar serían:

  • Disponibilidad limitada por zonas
  • No cuenta con soporte de versiones
  • No ofrece distribución Linux
  • Necesita gestión supervisada

Comparativa base de datos: Amazon Redshift

Amazon Redshift es un servicio de almacén de datos a escala de petabytes totalmente administrado. Redshift está diseñado para cargas de trabajo analíticas y se conecta con clientes estándar basados en SQL y herramientas de inteligencia empresarial.

Según el sitio web de Amazon, Redshift ofrece un rápido rendimiento de consulta y E/S para conjuntos de datos de prácticamente cualquier tamaño mediante el uso de tecnología de almacenamiento en columnas y la paralelización y distribución de las consultas en múltiples nodos. La mayoría de las tareas administrativas comunes asociadas con el aprovisionamiento, la configuración, la supervisión, las copias de seguridad y la protección de un almacén de datos están automatizadas.

  • Amazon Redshift es un servicio de almacenamiento de datos gestionado y escalable en la nube.
  • Soportado por el ecosistema de Amazon Web Services (AWS) e integrable con sus servicios (Kinesis, SageMaker, EMR, Glue, DynamoDB, Athena, etc.).

Como principales puntos a favor para la comparativa de base de datos podemos mencionar que tiene un escalado simultáneo para mejorar el rendimiento de las consultas.

  • Copia de seguridad de datos almacenada en AWS S3
  • Virtualización de los datos que habilita un análisis de datos distribuidos entre diferentes plataformas dispares
  • No necesita gestión supervisada
  • Soporta la integración con MicroStrategy, Qlik, Tableau, IBM, Alteryx, etc.
  • El cálculo del precio mensual es sencillo y depende únicamente del uso y el número de clústeres contratados

Como puntos en contra se detectan algunos problemas de escalabilidad vertical así como:

  • No soporta textos largos en columnas (no más de 64K)
  • No permite el acceso por consola de máquina virtual.
Puntuación en las review de mercado de Garnet de 4.4

Comparativa base de datos: Snowflake Data Warehouse

La plataforma de datos en la nube Snowflake incluye un almacén de datos SQL puro. Diseñada con una nueva arquitectura patentada para manejar todos los aspectos de los datos y la analítica, combina alto rendimiento, alta concurrencia, simplicidad y económica a niveles que no son posibles con otros entornos de datos. Es una base de Datos exclusivamente en la nube y completamente gestionada.

  • Snowflake ofrece una clara separación entre computación y almacenamiento.
  • Ofrece la posibilidad de conectarse a AWS para almacenar los datos en S3 para ofrecer proximidad a los datos cuando se ejecuten las queries
  • Snowflake tiene básicamente dos niveles de configuración: según el tamaño del cluster y según la cantidad máxima de clusters permitidos para gestionar la computación actual.

Como principales puntos a favor para la comparativa de base de datos podemos destacar su fácil utilización y abstracción para el usuario.

  • La gestión de concurrencia se basa en máquinas stateless evitando problemas típicos de estos casos.
  • Se puede usar desde línea de comandos Linux para la carga y descarga de datos.
  • Compatibilidad con ANSI-SQL (aunque no es idéntica la sintaxis).
  • Integrable con IBM Cognos, Informatica, Power BI, Qlik, Apache Spark, Tableau, etc. y muy sencillo de conectar a otras BBDD.
  • No necesita gestión supervisada (modo fully-managed).

Como puntos en contra destacar que al necesitar recuperar datos de S3 los tiempos de ejecución de las querys pueden aumentar, considerablemente en algunos casos.

  • La falta de configurabilidad supone un impacto en el rendimiento ya que depende en gran medida del caché.
  • La opción multi-cluster tiene un precio elevado.
Puntuación en las review de mercado de Garnet de 4.8

Funciones MySQL para convertir timestamp a fecha

En el siguiente artículo comentaré cómo pasar la representación de una fecha en timestamp de unix a formato de tipo ‘YYYY-MM-DD HH:MM:SS’ mucho más legible y con el que podremos realizar consultas mas específicas.

[amazonproducts asin=»B0026OR3KS» use_carturl=»1″ features=»1″ desc=»1″ gallery=»1″ show_list=»1″ button=»boton-comprar»]La guía de refencia de Mysql. Las funciones y utilidades más importantes de MySQL.[/amazonproducts]

Funciones MySQL para convertir timestamp a fecha

En base de datos se suele guardar las fechas en formato timestamp pues contienen algo más de información que si por defecto formateamos y guardamos la fecha en formato ‘YYYY-MM-DD HH:MM:SS’ o ‘YYYY-MM-DD’. Para obtener el timestamp de una fecha en PHP usaremos la función time(), con la que obtendremos el timestamp de la fecha del momento en que se ejecuta.

La función de MySQL que realiza la conversión de timestamp a fecha es: FROM_UNIXTIME(unix_timestamp) en la que sólo se la pasa el timestamp y el formato que devuelve es el de por defecto: ‘YYYY-MM-DD HH:MM:SS’.

También se le puede especificar un formato para deveolver tan sólo lo que queramos FROM_UNIXTIME(unix_timestamp,format). Veamos algunos ejemplos:

Queremos tan sólo el año


select from_unixtime(fecha_creacion,'%Y') as fecha from table group by fecha

Resultado:

fecha
2012

Queremos el siguiente formato: mes. día.año


select from_unixtime(fecha_creacion,'%m.%d.%Y') as fecha from table group by fecha

Resultado:

fecha
07.06.2012
07.11.2012

Si esto mismo lo queremos poner en formato español con el mes en medio, tan sólo cambiaremos el especificador del mes(%m) de posición


select from_unixtime(fecha_creacion,'%d.%m.%Y') as fecha from table group by fecha

Resultado:

fecha
06.07.2012
11.07.2012

También podemos indicar un formato de fecha y con la hora separado por dos puntos «:»


select from_unixtime(fecha_creacion,'%Y-%m-%d %H:%i:%s') as fecha from table group by fecha

Resultado:

fecha
2012-07-06 08:12:50
2012-07-11 09:09:28

Para todo el que quiera hacer pruebas y obtener éstos mismos resultados los timestamps que he utilizado son los siguientes:  1341555170 y 1341990568

 

Tabla con todos los especificadores de formatos de Fecha

En la siguiente tabla se indican todos los formatos que se pueden asignar para tratar una fecha en timestamp

EspecificadorDescripción
%aDía de la semana abreviado (Sun..Sat)
%bNombre del mes abreviado (Jan..Dec)
%cMes en número (0..12)
%DDía del mes con el sufijo en inglés (0th, 1st, 2nd,3rd, …)
%dDía del mes en número (00..31)
%eDía del mes en número (0..31)
%fMicrosegundos (000000..999999)
%HHora (00..23)
%hHora (01..12)
%IHora (01..12)
%iMinutos (00..59)
%jDía del año (001..366)
%kHora (0..23)
%lHora (1..12)
%MNombre del mes (January..December)
%mNúmero del mes (00..12)
%pAM or PM
%rFecha, 12 horas (hh:mm:ss seguido de AM or PM)
%SSegundos (00..59)
%sSegundos (00..59)
%TFecha, 24 horas (hh:mm:ss)
%USemana (00..53), donde Domingo es el primer día de la semana
%uSemana (00..53), donde Lunes es el primer día de la semana
%VSemana (01..53), donde Domingo es el primer día de la semana; usado con %X
%vSemana (01..53), donde Lunes es el primer día de la semana; usado con %x
%WNombre del día de la semana (Sunday..Saturday)
%wDía de la semana (0=Domingo..6=Sábado)
%XAño para la semana donde Domingo es el primer día de la semana, numérico de 4 dígitos; usado con %V
%xAño para la semana donde Lunes es el primer día de la semana, numérico de 4 dígitos; usado con %v
%YAño, numérico de 4 dígitos
%yAño numérico de 2 dígitos
%%Carácter literal “%”
%xx, para cualquier «x» no mencionados anteriormente

Lectura Recomendada

Fuente:

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_from-unixtime

Puedes haber encontrado este artículo realizando las siguientes búsquedas relacionadas:

convertir formato update de Mysql a rss, workbench caracteristicas ventajas y desventajas, guardar fecha timestamp, cambiar formatos de fechas en mysql workbench, funciones para cambiar la fecha de mysql, pasar fecha con unix time mysql, phpmyadmin – 2 11 10 tutorial y comandos, como obtener de un timestamp solo la fecha, convertir time a minutos mysql, workbench, mysql formato meses en español, convertir timestamp mysql a nombres de dias, conversor de fecha mysql, mysql transformat numero dias a fecha, funcion para convertir fecha en mysql, pasar hora desde php a mysql, convertir fecha mysql en rss, mysql cambiar formato de fecha y actualizarlo, timestamp mysql php, funcion para convertir la fecha a español en workbench, operaciones fechas timestamp java mysql, para que sirve timestamp, funcion conversor a timestamp mysql, mysql, como pasar hora unix con consultas sql, convertir a segundos mysql, cambiar formato de fecha y hora sql en php, convertir date a timestamp mysql, convertir fecha dd mm yyyy a yyyy-mm-dd y comparar mysql, convertir timestamp a otro valor tsql, convertir de formato timestamp a formato yyyy/mm/dd en shell script, transformar fecha timestamp english a dd-mm-yyyy hh:mm:ss en sql, indicar la semana del mes según la fecha con php y mysql, para que es from_unixtime, cambiar formato de fecha en el resultado de mi consulta php, funcion en php para pasar los meses del año a español, insertar solo mes y año en mysql, formato de fecha en java para grabar en sql, seleccionar solo fechas en un timestamp mysql, sql para cambiar filas a md5, formato de feche unix sql, como convertir una fecha solo en mes, sqlserver legible timestamp, ejemplo para mejorar el rendimiento de una SQL en PHP, convertir yyyymmdd a lunes 1 de agosto, consultar tabla con fecha timestamp, como obtener la hora en un campo unixtime de mysql, poner dia lunes de la semana en fecha en tabla mysqls, convertir dato timestamp, convert timestamp to datetime sql, sentencia sql para cambiar formato de fecha en phpmyadmin, cambiar formato fecha mysql phpmyadmin, convertir timestamp a numero, funciones mysql 2012, Crear una tabla con fecha con solo mes y a, obtener fecha timestamp mysql, cambiar formato de timestamp MySQL, formato de fecha mysql para consulta sql, funcion mysql para timestamp, timestamp whatsapp convertir fecha, como leer un timestamp en android, mysql funciones timestamp, convertir fecha en hora en mysql, convertir fecha en mes en consulta sql, formula para convertir horas a microsegundos, transformar fecha a mes en mysql, convertir a fecha mysql, convertir timespan datetime mysql, dar formato a fecha timestamp con PHP, funciones de fechas workbench, obtener año mysql timestamp, como indicarle a mysql que la fecha se inserta con dia mes y año, convertir fecha en mysql, from_unixtime mysql format A√ëO, representacion de formato fecha dd/mm/yyyy en mysql, selec fecha timestamp, formatear fecha a yyy/m/dia y hora php, convertir una fecha a timestamp en mysql, convertir timestamp sql fecha, obtener solo el nombre del mes en mysql en español, funciones para convertir fecha a char en mysql, convertir fecha a segundos mysql, pasar de fecha dia a nombre del dia en php, cambiar formato fecha mysql php, comando en mysql para pasar los dias de la semana a español, comando para convertir la fecha en php, mysql como extraer fecha de un timestamp, FROM_UNIXTIME php sin hora, consultar fechas timestamp en mysql, funcion convertir fecha mysql, funcion timestamp, funciones de semana en sql, funciones de fecha en mysql, transformar timestamp segundos mysql, funciones time workbench, como guardar los dias de la semana en php a sql, seleccionar mes de datos timestamp en mysql, convertir timestamp a fecha mysql, como ver fecha en timestamp sql, mysql workbench como insertar fecha que inicia con dia mes y año, fecha to timestamp, mysql timestamp obtener fecha, extraer fecha de timestamp en mysql, mysql fechas convertir, convertir fecha año mes dia mysql, consulta sql date de un timestamp, como obtener fecha timestamp mysql, como utilizar timestamp mysql, mysql convertir fecha OADAte, CAMBIAR EL FORMATO DE FECHA DESDE MYSQL, funciones de hora y fecha en mysql 5 0, PRIMER lunes DE LA SEMANA mysql, cambiar formato fecha separado por / sql, como convertir un campo timestamp de fecha sqllite, mysql comando para obtener timestamp, SEPARAR UN TIMESTAMP EN MYSQL, cambio de timestamp a fecha, comando para mandar la fecha por separado mysql, convertir la fecha en el nombre del dia en español mysql, sql obtner fecha de timestamp, timestamp a fecha sql, como funciona sintaxis time y timestamp en bases de datos con workbench, convertir fecha de timestamp a date en mysql, mysql convertir mes actual en numero, formato español fecha timestamp, como es la conversion de time a java, como convertir timestamp a dd/mm/aaaa, mysql covertir fecha de timestamp, mysql convertir timestamp a fecha, convert date a timestamp mysql, mysql UNIX_TIMESTAMP timestamp to unix, pasar time a formato time php, fecha timestamp mysql, con que funcion podemos saler el timestamp actual, sql de formato unix a formato humano, convertir campo numerico a fecha mysql, dia de la semana en un timestamp, obtener fecha en sql hh:mm:ss, como forzar a mysql a devolver un campo de timestamp en formato unix, convierte fecha y gardala en mysql, convertir fecha de localhost, unix time dia semana, php convertir fecha, pasar número fecha php a fecha sql, TIMESTAMP EN CREATE DE MYSQL, comando convertir timestamp ms2 d&amp, mysql formato fecha timestamp, mysql convertir fecha, obtener fecha timestamp oracle, convertir timespan a hora, timestamp cambiar fecha, convertir a fecha en mysql, CONVERTIR DIA MES A√ëO A FECHA EN SQL, CONVETIR DOS CAMPOS FECHA Y HORA EN TIMESTAMP EN FIREBIRD, obtener tiemstamp de sql sin milesiman, sacar dia de un timestamp, mysql timestamp a fecha, convertir de timestamp a date mysql, timestamp en formato numero, como recibir fecha yyyy/MM/dd en php, OBTENER HH MM SS EN SQL, traducir fechas de sql, mysql obtener numero de dia del mes, que es from_unixtime, convertir de fecha a unixtime mysql, comparar tipo timestamp en mysql, separar la fecha de un timestamp

Crear un esquema EER desde el gestor de base de datos MySQL Workbench

Usando MySQL Workbench.

MySQL Workbench es una herramienta para desarrollar y administrar bases de datos. Tiene 3 grandes areas de funcionalidad:

  1. SQL Development: Reemplaza a MySQL query browser. Desde aquí termine al usuario conectar a una base de datos existente, permite realizar queries, y una administración básica de la base de datos.
  2. Data Modeling: Es un completo gestor visual para diseñar y definir la arquitectura de la base de datos.
  3. Database Administration:Reemplaza a MySQL Administrator, es un interface gráfico para administración de la base de datos y del servidor en general, se puede editar archivos de configuración de Mysql, se puede crear nuevos usuarios, y si estamos trabajando con una base de datos local, se puede reiniciar el servicio de mysql.

Planificando la base de datos
Como siempre lo mejor es hacer un boceto rápido en papel.
Como veis en la siguiente imagen no podría entregar a un equipo de desarrolladores la arquitectura de la base de datos con el siguiente gráfico, aunque en el mundo real a veces las especificaciones que te dan se parecen a estas, un infierno.

El esquema que se puede elaborar desde Mysql WorkBench es un esquema EER.
EER es un modelo de alto nivel o modelo conceptual de datos que mejora la entidad-relación (ER), que se utiliza en el diseño de bases de datos. Se utiliza para reflejar con toda la precisión que se pueda las características y limitaciones que se encuentran en una base de datos. EER viene del ingles enhanced entity-relationship o modelo entidad-relación mejorado.

El modelo EER incluye todos los conceptos introducidos por el modelo ER. Además, incluye los conceptos de una subclase y superclase, junto con los conceptos de especialización y generalización. Además, se introduce el concepto de un tipo de unión o de una categoría, que se utiliza para representar una colección de objetos que es la unión de objetos de diferentes tipos de entidades.

Relaciones entre tablas

Si queremos crear tablas físicas en MySQL las relaciones tienen que estar mapeadas de alguna manera.
Para mapear estas relaciones entre tablas existen diferentes reglas:

  • 1:1. El primary key para una de las tablas es incluido como foreing key en otra tabla.
  • 1:n. uno-a-muchos. Consiste en establecer una relación entre un atributo identificativo, ya sea un primary key u otro campo que permita diferenciarlo de otra instancia de una tabla A, con n campos de la tabla B. Por ejemplo:
    Una factura (entidad) se emite (relación) a una persona (entidad) y sólo una, pero una persona puede tener varias facturas emitidas a su nombre. Todas las facturas se emiten a nombre de alguien.
  • n:m. Es cuando se crea una tabla mediante un join. La clave primaria es compuesta por los primary keys de las dos tablas originales. Por ejemplo: Un cliente (entidad) puede comprar (relación) varios artículos (entidad) y un artículo puede ser comprado por varios clientes distintos.

Crear El schema y las tablas

Desde el menú principal de Mysql Workbench seleccionamos la opción de Create New EER Model.

Creamos o importamos nuestra base de datos con las tablas. O las vamos creando desde 0, a partir de nuestro boceto inicial.
La creación de la arquitectura de la base de datos y las tablas no es algo que salga a la primera, requiere ir profundizando en la aplicación, estimar que necesitarás a largo plazo y contemplarlo en el modelo de datos a pesar de que no se programe inicialmente.

El menu principal que veremos será algo parecido a esto.

Una vez tengamos nuestras tablas creadas, o al menos la primera version o fase de las tablas, pinchamos en el botón de EER Diagram para crear nuestro modelo EER.O bien podemos seleccionar Model >Create Diagram from catalog object.

Esto nos cargará todas las tablas que hemos creado en el canvas de la aplicación y podremos empezar a establecer las relaciones entre las tablas.

Como he explicado anteriormente usaremos los tipos de relaciones para ir creando el modelo de relación entre nuestra tablas. Para ello usaremos las opciones de MySQL Workbench para establecer las relaciones.

A medida que se vayan creando las relaciones irá quedando el modelo definido, como aparece en la siguiente imagen.


(Nota: este modelo es una ejemplo que estoy utilizando, no es real)

Se puede cambiar el tipo de notación que representan las relaciones. A mi personalmente me gusta mas el tipo de notación UML que el que esta usando Workbench.
Para cambiarlo, dentro de la Diagrama EER > Model > Relationship Notation y se pueden elegir entre 5 opciones.

Esto llevará varias horas, o como a mi varios días. Si se esta haciendo un modelo de datos profesional para un entorno en producción puede llevar bastante tiempo en el desarrollo de la arquitectura de la base de datos. Incluso a pesar de todo el tiempo invertido siempre pueden surgir limitaciones y deficiencias.
Es muy importante intentar desarrollar el modelo pensando en todas la funcionalidades que tendrá la aplicacion a corto y que pueda tener a largo plazo. Para por lo menos tener un buen modelo de datos en el momento de salida y poder escalar bien la base de datos.

El diagrama se puede exportar a PNG, SVG, PDF o un archivo PostScript.

Uno de mis proyectos actuales presenta el siguiente aspecto:

Conclusión: MySQL Workbench es una herramienta excepcional y sin duda algo que se debería usar en todo momento a la hora de gestionar una base de datos, como mínimo la parte de Data Modeling y Database Administration. En este tutorial no me acerco ni de lejos a todo el potencial del programa pero al menos he comentado a modo de introducción una de las partes que es el diagrama EER.

Instalar phpmyadmin

phpMyAdmin es una herramienta escrita en PHP con el fin de facilitar la tarea de administración de una base de datos MySQL desde el navegador.

Se trata de una herramienta escrita íntegramente en lenguaje PHP, realizada con el fin de facilitar las tareas de administración. Permite administrar en forma completa un servidor MySQL (requiere de una cuenta super usuario) como así también bases de datos simples de un usuario en particular.

1. su –
2. cd /var/www/html
3. wget -c wget http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/2.11.10/languages.zip?use_mirror=switch

Si queremos la ultima versión:
wget http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/3.3.8/phpMyAdmin-3.3.8-all-languages.zip/download

4. unzip phpMyAdmin-2.11.10-all-languages.zip
5. mv phpMyAdmin-2.11.10-all-languages phpmyadmin
6. cd phpmyadmin
7. cp config.sample.inc.php config.inc.php
8. vi config.inc.php
….
$cfg[‘Servers’][$i][‘auth_type’] = ‘http‘;
….
9. /etc/init.d/httpd restart

Tras esto lo tendrás accesible desde http://dominio.com/phpmyadmin/

Si no se tiene acceso a la maquina por consola o estais un poco perdidos con estos comandos de linux, se podría hacer subiendo todo el desarrollo por ftp, previa descompresión en vuestro equipo y luego editando el archivo config.inc.php. Pero claro este modo de hacerlo es mucho mas lento pues tarda mas en subirse todo al servidor (siempre y cuando lo queráis instalar en un servidor remoto, en local es todo mas rápido)

Si os da el siguiente error ( no se pudo cargar la extension mcrypt, por favor revise su configuración de PHP):

Tendremos que instalar el modulo de php php-mcrypt
# yum install php-mcrypt

Lo ideal seria proteger el acceso a nivel de Apache mediante .htaccess y .passwd

Que diferencias (básicas) hay entre InnoDB y MyISAM

Ventajas de MyISAM

  • Bloqueo de tablas
  • Nos permite tener las características ACID (Atomicity, Consistency, Isolation and Durability: Atomicidad, Consistencia, Aislamiento y Durabilidad en español), garantizando la integridad de nuestras tablas.
  • Optimizadas para realizar un gran números de SQL SELECT.

Desventajas de MyISAM

  • Las tablas pueden llegar a dar problemas en la recuperación de datos.
  • El bloqueo de las tablas cuando se inserta o actualiza un registro es otra posible desventaja ya que el resto de las operaciones quedarán a la espera de la inserción o actualización del registro.

Ventajas de InnoDB

  • Integridad de datos, cuando los contenidos se modifican con sentencias INSERT, DELETE o UPDATE, la integridad de los datos almacenados puede perderse de muchas maneras diferentes.
  • Pueden añadirse datos no válidos a la base de datos, con las tablas InnoDB es más difícil que esto ocurra.
  • Mayor velocidad en general a la hora de recuperar datos.
  • Recomendable para aplicaciones en las que dominan las sentencias  INSERT / UPDATE.
  • Ausencia de características de atomicidad ya que no tiene que hacer comprobaciones de la integridad referencial, ni bloquear las tablas para realizar las operaciones, esto nos lleva como los anteriores puntos a una mayor velocidad

Desventajas de InnoDB

  • El diseño de su estructura es mucho más complejo que el diseño de una tabla MyISAM
  • No soporta búsquedas full-text, que para conjuntos de datos grandes, es mucho más rápido.
  • La última desventaja es su pobre rendimiento en operaciones sencillas como seleccionar datos si lo comparamos con las tablas MyISAM.

Una aplicación, multiples bases de datos CakePHP

Tengo que lanzar un web para varios países y aprovecharé la potencia de CakePHP para realizar una sola plataforma con varias bases de datos. Cada base de datos almacenará el contenido local de cada web.

Lo que he hecho es en /(app)/config/bootstrap.php incluir mi código de configuración personalizado. Ver funcionalidad del boostrap

Para determinar y estandarizar la url que me llega realizo la siguiente comprobación

$datos_dominio = explode(".",$_SERVER['HTTP_HOST']);
if (in_array("www",$datos_dominio))
{
$dominio ='';
}
else
{
$dominio = 'www.';
}

for($i=0;$i < count($datos_dominio);$i++)
{
if($i == 0)
{
$dominio .= $datos_dominio[$i];
}
else
{
$dominio .= '.'.$datos_dominio[$i];
}
}
?>

Con el dominio que he obtenido lo paso por un switch case y la variable final con el valor de la base de datos la guardo en una constante que usaré mas adelante.

switch ($dominio)
{
case 'www.cake.loc':
$bbdd = 'default';
break;
case 'www.cake.loc.uk':
$bbdd = 'default_uk';
break;
case 'www.cake.loc.mx':
$bbdd = 'default_mx';
break;
default: $bbdd = 'default';
}
define('BBDD',$bbdd);

Posteriormente en mi modelo seleccionaré la base de datos que se ha guardado automaticamente en la constante BBDD

Ejemplo de mi /(app)/models/contenido.php

class Contenido extends AppModel
{
var $name = 'mos_content'; // nombre de la tabla que estoy usando
var $useDbConfig = BBDD; // conexión a la base de datos que he obtenido automaticamente
}

Error Client does not support authentication protocol requested by server

Porqué sucede y que hacer cuando obtiene éste error:  Client does not support authentication protocol requested by server.

Primero, se produce porque a partir de la versión 4.1.1 MySQL usa un protocolo de autenticación basada en un algoritmo de encriptación de passwords obsoleto.  El nuevo formato password de mysql genera un hash mucho más largo y óptimo.


Pero La solución es sencilla:

Entrar  en el mysql  o cualquier manager de MySQL que tengáis, por cierto, yo uso YogSQL Community Edition, es una de las herramientas más potentes para gestionar el MySQL que he usado.

Deberéis entrar con el usuario que os está dando problemas, en éste caso root y seleccionar la base de datos: mysql
y a continuación ejecutar el siguiente comando:

update user set password=old_password('clave') where user='root';

Aplica cambios en tabla de usuarios:

flush privileges;

Ready!! 🙂

Realizar busquedas con like

Lo que nos viene es un string como vemos en la primera linea del codigo. Lo que hacemos es descomponerla y separarla por partes para hacer diferentes consultas LIKE que luego pondremos en la consulta final .

[code lang=»php»]
$tags1 ="busqueda que se desea";
$trozos = array ();
$trozos = explode(" ", $tags1);
$tags_sql= "";

for($i=0;$i&lt;count($trozos);$i++)
{
$trozos[$i] = str_replace(" ",", ",$trozos[$i]);
if ($i==0)
{
$tags_sql .= "’%".$trozos[$i]."%’";
}else
{
$tags_sql .= " or subfiltro like ‘%".$trozos[$i]."%’";</blockquote>
}
}
$query = "SELECT * FROM table WHERE tags like " .$tags_sql ." ORDER BY RAND() limit 0,1";
[/code]
si hacemos un echo de $query, obtendremos lo siguiente:

[code lang=»php»]
SELECT * FROM table WHERE tags like ‘busqueda’ or tags like ‘que’ or tags like ‘se’ or tags like ‘desea’ ORDER BY RAND() limit 0,1
[/code]