X

MySQL vs MySQLi: ¿Qué diferencias tienen?

MySQL es uno de los Sistemas de Gestión de Base de Datos relacionales mas populares, este fue lanzado en 1994 y desde su lanzamiento no paró de crecer en popularidad. Incluso hoy en día MySQL sigue siendo el SGBD de código abierto mas utilizado.

Actualmente tiene una licencia dual, una licencia publica y una licencia comercial por parte de Oracle.

Y como parte de esta serie de comparaciones en el mundo de las bases de datos (especialmente como MySQL vs MariaDB), hoy abordaremos un versus muy frecuente que genera confusión entre desarrolladores que recién inician: MySQL vs MySQLi.

¿Qué es MySQLi?

MySQLi no es un Gestor de Base de datos, sino que es una opción mas para la conexión he interacción con MySQL. Su nombre viene de MySQL Improved y es una interfaz mejorada de PHP, por lo que se utiliza únicamente para PHP Scripting.

Este implementa varias mejoras a nivel de desempeño, seguridad y funcionalidades, las cuales iremos viendo a lo largo del artículo.

MySQL vs MySQLi: ¿qué diferencias existen?

MySQLMySQLi
Estructura de código basada en procedimientosPodemos trabajar con procedimientos u orientación a objetos
Interfaz de comandoInterfaz gráfica
Está escrito en C y C++Está escrito en PHP y se utiliza únicamente con este lenguaje.
Es vulnerable a ataques de SQL injection.Previene inyecciones SQL, al recibir consultas desde un input devuelve error.
Soporta transacciones ACID. Soporte API para Transacciones.
Soporta múltiples declaraciones y las envías todas juntas para ejecutarse. Las declaraciones múltiples se realizan a través del método multi_query
En las Instrucciones preparadas es necesario realizar ciertos controles para evitar SQL injection. Las instrucciones preparadas pueden ejecutarse directamente a través de los métodos prepare, bind_param y execute.
Lanzado en 1995Lanzado en 2004 mediante múltiples paquetes.

Orientación a Objetos

MySQL tiene un enfoque basada en procedimiento para realizar las consultas con la base de datos. Esto implica que el objeto resultado de la consulta se considere un paso en el procedimiento.

MySQLi por otra parte tiene un enfoque dual, podemos utilizarlo orientado en procedimiento. Esto mas que nada es por un tema de compatibilidad con MySQL y un fácil pasaje de uno a la otro.

El otro enfoque que permite MySQLi es Orientado a Objeto. Con la orientación a objetos todo se centra en el resultado. Esté logra una mejor integración entre nuestro código PHP y la base de datos. Además, nos ayuda a reducir código.

Por otra parte, no podemos decir que la orientación a objetos tenga una mejora en performance significativa, por lo que podemos optar entre este o procedimiento según nos sea mas práctico.

Ejemplo de código de conexión a la base de datos con MySQL

 $dbc = mysql_connect("localhost", "user", "password"); $db = mysql_select_database("database");

Ejemplo de conexión con MySQLi

 $db = new mysqli("localhost", "user", "password", "database");

Transacciones

El motor InnoDB de MySQL soporta las transacciones ACID. Estas siglas vienen de sus propiedades:

  • Atomicidad: Si el cambio no logra completarse totalmente no se realizara ningun cambio.
  • Consistencia: Cualquier cambio realizado debe mantener el estado de la base de datos válido de acuerdo con sus restricciones y esquema de datos.
  • Aislamiento (Isolation): Un cambio no debe afectar otros cambios que se estén realizando en simultáneo.
  • Durabilidad: Una vez realizado el cambio este debe perdurar sin importar fallos en la base de datos o el sistema.

MySQLi ofrece una API para el soporte de las transacciones de MySQL. Esto nos permite utilizar las transacciones ACID de MySQL mediante llamadas a una API. Por ejemplo podemos activar o desactivar el modo auto-commit, iniciar una transacción o revertirla.

Instrucciones Preparadas

Las instrucciones preparadas se utilizan para ejecutar una misma consulta varias veces, incrementando su eficiencia y mejorando el tiempo de respuesta.

En MySQL este tipo de instrucciones tienen dos instancias, la de preparación y la de ejecución. Cuando se encuentra en el estado de preparación este compila los datos y reserva los recursos que va a necesitar.

Durante el periodo de ejecución es cuando realmente se envían los datos y este los procesa según las instrucciones previamente compiladas. De esta forma permite que se ejecute múltiples veces en menor tiempo.

En MySQLi también podemos utilizar instrucciones preparadas, en este caso los métodos son diferentes. Aquí agregamos una instancia mas, además de prepare y execute, se le suma bind_param.

La función bind_param lo que hace es agregar variables a la instrucción, donde es necesario indicar el tipo de dato. Para ello se utiliza i para enteros, d para double, s para string y b para blob (Binary Large Objects). Si por algún motivo falla al agregar las variables esta devolverá false y true si todo salio bien.

Todo esto nos sirve como protección contra la inyección de código malicioso. Este se asegura de la correcta ejecución de las distintas fases antes de aplicar los cambios en la base de datos.

En el caso de MySQL no existe una verificación contra la inyección de código SQL, debiendo verificar todo por nuestra cuenta.

Eficiencia

En términos de eficiencia podemos decir que MySQLi es el claro ganador. Esté es más eficiente en el uso de recursos, para una misma tarea realiza menos consultas a las base de datos lo que deriva a sobrecargar menos al servidor.

Continuando con MySQLi, gracias a las funcionalidades que agrega y a la posibilidad de orientación a objetos, se reduce la cantidad de código.

Por consiguiente, MySQL realiza mas consultas a la base de datos para una misma instrucción, lo que lleva a un alto consumo de recursos.

Además, no debemos olvidarnos que MySQL no provee protección contra la inyección SQL, algo que debemos controlar por nuestra parte y que aumentará la cantidad de código significativamente.

Depuración

Entre las mejoras realizadas en MySQLi se incluye la Depuración. Con este podemos realizar consultas de tipo depurativas a nuestra base de datos. Esto es una gran ayuda para los programadores, ya que agiliza el proceso de desarrollo y solución de errores.

Un ejemplo de consulta de debug serie el siguiente:

mysqli_debug(“d:t:o,/tmp/client.trace”

Conclusión sobre MySQL vs MySQLi

Si vamos a trabajar con PHP lo mejor es utilizar MySQLi, ya que como vemos este es una versión mejorada de MySQL. Además de que nos brinda soporte para un facil pasaje de MySQL a MySQLi.

Otra razón para cambiarnos a MySQLi es que la sintaxis es muy similar, por lo que no tendremos mayor dificultad para adaptarnos. Asimismo, hay que tener en cuenta que MySQL está deprecado y funciona con versiones viejas de PHP. Por el contrario, si utilizamos otros lenguajes de programación lo mejor es utilizar MySQL.

Y tú ¿Cuál extensión utilizas en tus proyectos? ¿Ya habias oido de MySQLi?

Artículos relacionados