Está en la página 1de 51

Hola, te doy la bienvenida a un nuevo entrenamiento en nuestra plataforma Alura.

Mi nombre es
Álvaro Camacho y seré tu instructor en la parte dos de este curso de administración de MySQL,
seguridad y optimización de la base de datos.

[00:16] Entonces, en este curso, como te lo mencioné en el anterior, es necesario que ya hayas
participado en los cursos anteriores de nuestra formación, porque ya con este daremos por
concluida toda nuestra carrera en MySQL.

[00:30] Entonces en este curso nos estaremos enfocando principalmente en el plan de ejecución,
vamos a hablar un poco más sobre índices y estaremos hablando específicamente sobre gestión
de usuarios y gestión de privilegios, entonces para ello vamos a generar algunas consultas aquí a
la base de datos y mediante el comand Prompt estaremos evaluando el plan de ejecución para
ver el costo de cada una de estas consultas.

[00:57] Entonces, entre más operaciones nosotros hagamos con nuestras tablas, vamos a tener
un costo más elevado, y si nosotros no estamos utilizando índices para hacer nuestras
operaciones, lo más posible es que obtengamos costos mucho más altos que cuando usamos
índices.

[01:17] Por ello, vamos a estar viendo el concepto de índices, vamos a estar trabajando y
reconociendo cómo es que las diversas tablas, por ejemplo MyISAM e InnoDB trabajan con
índices, que por ejemplo MyISAM puede trabajar con el algoritmo hash o con el algoritmo
Btree, y InnoDB únicamente con el algoritmo Btree de indexación.

[01:38] De la misma manera, vamos a hacer simulaciones de conexiones para el acceso a nuestra
base de datos para ver cómo se comporta nuestra conexión, o cómo se comportan las
operaciones que hagamos al interior de la base de datos, cuando muchos usuarios están
accediendo a ellas a través de mysqlslap.

[02:00] Veremos el tiempo de demora de las conexiones, dependiendo de cómo se hagan las
mismas, si se tiene en cuenta índices y si no se tiene en cuenta índices, porque dentro de las
muchas operaciones que se pueden desarrollar para mejorar el desempeño de nuestra base de
datos, se encuentra principalmente el trabajar con los índices.

[02:21] Vamos también a trabajar con la creación de usuarios, vamos a crear usuarios
administradores, usuarios comunes, usuarios que solo puedan hacer lectura, usuarios que puedan
hacer el backup, vamos a mostrar cómo acceder al servidor desde cualquier dirección IP o desde
cualquier máquina.

[02:38] Vamos también a estar limitando el acceso a ciertos usuarios a ciertos esquemas, y
también limitando los privilegios que sean a los usuarios, tanto al esquema como a una tabla en
específico, y mostraremos cómo revocar esos privilegios a nuestros usuarios. Todas esas
funciones del DBA que debe conocer para poder entonces, administrar bien su ambiente o su
entorno de su base de datos.

[03:10] Vamos a seguir adelante con este entrenamiento y vamos a dar por finalizada esta
formación en MySQL. Continuemos trabajando.
Les saludo una vez más a todos y a todas. Ahora vamos a estar en esta segunda parte de nuestro
entrenamiento, hablando en primer lugar un poco más sobre la optimización del desempeño de
las consultas.

[00:14] Uno de los principales deberes o de las principales funciones del DBA es auxiliar al
analista digamos, en el mejoramiento, por decirlo así, del desempeño de sus consultas, porque
muchas veces cuando las consultas son un poco más rebuscadas o más específicas, entonces
puede haber una demora en la ejecución, en el tiempo de ejecución.

[00:42] Y lo que queremos es que el tiempo de ejecución sea el menor posible, para que sea un
trabajo de queries más óptimo, vamos a decirlo de esa forma. Entonces para ello vamos a
desarrollar los siguientes queries y vamos a ir evaluando simultáneamente el tiempo en que se
demoran estas consultas.

[01:05] Entonces venimos aquí a nuestro script y vamos a iniciar con un query aquí en la tabla
de productos, entonces SELECT CÓDIGO_DEL_PRODUCTO FROM tabla_de_productos. Y
la tabla_de_productos la vamos a llamar A. Entonces, aquí A código del producto, ejecutamos
este query y nos devuelve los códigos del producto.

[01:46] Y si ustedes observan aquí, voy a darle un zoom, dice que se demoró 0 segundos, o sea,
no demoró ni un milisegundo, vean. Muy bien. Avancemos un poco aquí. Vamos a tomar este
mismo query, vamos a seleccionarlo, vamos a copiarlo. Pero esta vez queremos tomar de items
facturas la cantidad.

[02:11] Entonces C.CANTIDAD FROM tabla_de_productos A INNER JOIN items_facturas C


ON, entonces, lo que me relaciona a items_facturas con la tabla_de_productos es el
CÓDIGO_DEL_PRODUCTO. Entonces sería A.CODIGO_DEL_PRODUCTO =
C.CODIGO_DEL_PRODUCTO. Ejecutemos este query y ya se demoró un poco más. Noten
ustedes, se demoró 16 milisegundos.

[03:01] Volvamos acá y hagamos una consulta ahora en tres tablas. Entonces seleccionamos este
último query y vamos también a ver aquí en la tabla_de_facturas sería la fecha de venta. Pero
vamos a ver el año. Sería YEAR(FECHA_VENTA) AS AÑO. Entonces INNER JOIN con
items_facturas y otro INNER JOIN. INNER JOIN con B, B sería facturas, con facturas B ON,
entonces lo que me relaciona sería el número de la factura.

[04:01] Con items_facturas y facturas sería número, perfecto. Entonces ON C.NUMERO =


B.NUMERO. Ejecutemos este query. Perfecto. Bueno, no se demoró mucho tampoco, se
demoró 0 milisegundos. Ahora veamos este último query pero ahora usemos un GROUP BY.

[04:47] CANTIDAD. Hagamos, apliquemos una función aquí SUM(C.CANTIDAD) AS


CANTIDAD y vamos a darle un GROUP BY. GROUP BY sería
A.CODIGO_DEL_PRODUCTO, y también vamos a agrupar por el año. Y de la misma manera,
démosle un ORDER BY, los mismos dos campos por el código del producto y por el año.

[05:26] Ejecutemos este último query. Perfecto, noten ustedes, eso es lo que quería mostrarles
aquí. Entonces ya se demoró. 0.610 segundos. ¿Entonces qué sucede? En la medida que
nosotros vamos haciendo INNER JOINS, vamos haciendo GROUP BY, ORDER BY estas
operaciones, entonces ya el tiempo de la consulta él va a ir aumentando, dependiendo de la
forma como yo realice mi consulta.

[05:57] Entonces el desempeño puede ir perdiéndose un poco. ¿Por qué? Porque entonces estas
consultas son un poco más como más rebuscadas, más específicas. Vean ustedes, hicimos cuatro
consultas. Y en la medida que fuimos agregando diversos elementos a la consulta, entonces se
fue demorando un poco más. ¿Qué sucede? Debemos pensar si existe alguna herramienta o
algún mecanismo para poder saber cuánto se demorará mi consulta.

[06:29] Entonces, para ello existe un instrumento de MySQL llamado explain, que sería el
comando explain que lo vamos a estar viendo posteriormente. Y la idea de utilizar este comando
es que nosotros conozcamos el plan de ejecución, porque cuando conocemos el plan de
ejecución, entonces podemos tomar decisiones que van a mejorar el desempeño y tener un
impacto en el tiempo de ejecución de las queries, pero esto lo veremos en nuestro próximo
video. Ya nos vemos.

Analiza las siguientes consultas:

1)

SELECT * FROM TABLA1 INNER JOIN TABLA2 ON TABLA1.ID = TABLA2.ID INNER JOIN TABLA3 ON

TABLA2.ID = TABLA3.ID

GROUP BY 2 ORDER BY TABLA1.ID;COPIA EL CÓDIGO

2)

SELECT * FROM TABLA1 INNER JOIN TABLA2 ON TABLA1.ID = TABLA2.ID INNER JOIN TABLA3 ON

TABLA2.ID = TABLA3.ID;COPIA EL CÓDIGO

3)

SELECT * FROM TABLA1 INNER JOIN TABLA2 ON TABLA1.ID = TABLA2.ID;COPIA EL CÓDIGO

¿Cuál de estas consultas se va a demorar más durante su ejecución?

 Alternativa correta

Consulta 3.
¡Alternativa incorrecta! Esta consulta la es más rápida debido a que únicamente efectúa un INNER JOIN entre
dos tablas.
 Alternativa correta
Consulta 2.
¡Alternativa incorrecta! A pesar de que esta consulta tiene dos INNER JOINS, no ejecuta otros procedimientos
como por ejemplo el GROUP BY.
 Alternativa correta

Consulta 1.
¡Alternativa correcta! Así es, además de contar con 2 INNER JOINS realiza un GROUP BY a los datos.

Hola, alumnos y alumnas. Ahora, como les mencioné en el video anterior, vamos a estar
trabajando un poco para conocer cómo funciona el comando explain. Para ello vamos a acceder
a símbolo del sistema. Entonces sería CMD, Prompt de comando. Y en símbolo del sistema
vamos a hacer lo siguiente.

[00:21] Entonces es cd. Vamos a entrar a MySQL a través del símbolo del sistema, entonces cd
"Program Files", en Program Files va a ser MySQL, "MySQL SERVER" y aquí va a ser BIN.
Entonces, en este momento ejecutamos MySQL. Entonces sería MySQL usuario root y
password. Nos pide nuestra contraseña y estamos en MySQL.

[01:18] Vamos entonces a tomar este primer query. Vamos a copiar. Y bueno, antes de ello,
lógicamente, tenemos que especificar USE jugos_ventas; ya estamos en la base de datos
jugos_ventas, ahora sí colocamos este comando, pero antes de colocarlo vamos a darle
EXPLAIN. Sería el comando EXPLAIN.

[01:59] Entonces noten ustedes. Nos devuelve una tabla con un solo registro, nos devuelve un
solo registro porque es un registro por tabla, como aquí no tenemos ningún INNER JOIN,
ninguna operación con otra tabla, entonces nos devuelve toda esta información, pero así es un
poco difícil de visualizarlo.

[02:16] Entonces yo puedo también utilizar este comando EXPLAIN y utilizar aquí una \G; así
de esta forma. Entonces me la devuelve ya un poco más fácil de ver. Sin embargo hay una
información que nosotros pues necesitamos y que de repente no nos muestra aquí de forma muy
sencilla. Y para ello podemos utilizar un formato especial que es el formato Json: Javascript
Object Notation.

[02:52] Entonces, vamos a decir aquí: FORMAT = JSON. Ejecutémoslo. Y aquí entonces
nosotros vemos un elemento que es el "query_cost" que es el costo de la consulta. ¿En qué
unidades está expreso? No sabemos, no tiene ninguna unidad que nos diga 3.75 segundos o
milisegundos o a qué hace referencia. Pero lo que sí sabemos es que cuanto menor sea este
número, entonces es mejor el costo.

[03:36] Aquí tiene un costo de 3.75. Entonces yo voy a volver aquí a Workbench y voy a dejarlo
comentado. Entonces este sería costo 3.75. Veamos el siguiente query. Entonces, pero
pongámoslo todo en una línea. Seleccionémoslo y volvamos aquí a nuestro comand prompt y
vamos a darle nuevamente explain format=json.
[04:32] Y lo ejecutamos. Ah, y no olvidemos el \G; bien. Entonces venimos aquí y el costo de
esta consulta, vemos este loop, que es donde está ya el inner join, y aquí vemos query_cost. Ya
aumentó bastante. Entonces "60654.92", vamos a anotarlo.

[05:11] -- cost 60.654.92. Perfecto. Aumentó bastante, sustancialmente, pasó de 3 a 60.000


entonces, esto es algo para darle mucha atención. Veamos el siguiente query. Tenemos un
INNER JOIN aquí también. Serían dos INNER JOINs. Perfecto, entonces tenemos aquí toda
nuestra tercera consulta que realizamos.

[06:02] La seleccionamos. Y volvemos a nuestro comand prompt. Y le damos nuevamente el


mismo comando: EXPLAIN FORMAT=JSON y le damos aquí el \G; Lo ejecutamos de nuevo y
ya nos devuelve pues más información aún. Hay dos "nested_loop", el primer INNER JOIN y el
segundo INNER JOIN. Y nos estamos enfocando principalmente en este query cost, porque el
costo total va sumando el costo de evaluation cost, el costo de lectura, el costo del prefijo, varios
costos en cada uno de estos.

[06:55] Por ejemplo, aquí el read_cost va aumentando. Entonces vean ustedes que este valor es
como una suma de los costos de cada una de estas consultas: 211939.80. Entonces este otro
sería, veamos aquí. -- cost 211939.80. Ustedes van viendo que a medida que vamos
incrementando complejidad de la consulta, por decirlo de alguna forma, el costo va
aumentándose sustancialmente.

[07:42] Y veamos este último, este que ya tiene GROUP BY y todo lo demás, entonces demos,
seleccionemos todo, dejemos todo en una línea. Lo copiamos. Volvemos a nuestro comand
prompt. Y aquí, en el comand prompt, entonces le damos nuevamente EXPLAIN, es el
comando, EXPLAIN FORMAT=JSON, copiamos, pegamos nuestro query completo. No lo
seleccionó. Volvamos aquí. Perfecto y le damos \G; entonces ya él nos devuelve aún más
información y para cada una de estas operaciones devuelve un costo.

[08:54] Veamos aquí el query: 211939.80. Entonces sería aquí 211939.80, el mismo costo
anterior. ¿Qué quiere decir esto? Que si hacemos GROUP BY y ORDER BY ya no tiene ningún
costo adicional porque la información ya está de cierta forma de fácil acceso para hacer estas
últimas operaciones. Lo que más demora la consulta es los JOINs, y en cuanto más JOINs tenga
y más rebuscado sea, entonces el costo de la consulta va a ser superior.

[09:39] Entonces uno de los principales desafíos del DBA es ayudar al analista a optimizar sus
consultas, a realizar consultas de modo que el desempeño de la base de datos sea mejor. Y esto
entonces lo estaremos aprendiendo inicialmente a través del concepto de índices, y ya lo
veremos en nuestro próximo video. Entonces, ya nos vemos.

¿Existe una medida que representa el costo de la consulta?


 Alternativa correta

Sí, representa los segundos.


 Alternativa correta

No hay una unidad de medida.


¡Alternativa correcta! El costo no está expresado en ninguna unidad. Tan solo usamos este valor para compararlo
con otros planes de ejecución. Cuanto menor sea el valor, más rápida va a ser la consulta.
 Alternativa correta

Sí, representa bytes procesados.

Llegó la hora de que sigas todos los pasos realizados por mí durante esta clase. Si ya lo has
hecho ¡Excelente! Si todavía no lo has hecho, es importante que ejecutes lo que fue visto en los
vídeos para que puedas continuar con la próxima aula.
1) Selecciona la base jugos_ventas, y crea un nuevo script MySQL.

2) Digita las siguientes consultas:

SELECT A.CODIGO_DEL_PRODUCTO FROM tabla_de_productos A;

SELECT A.CODIGO_DEL_PRODUCTO, C.CANTIDAD FROM tabla_de_productos A


INNER JOIN items_facturas C ON A.CODIGO_DEL_PRODUCTO = C.CODIGO_DEL_PRODUCTO;

SELECT A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA) AS ANO,C.CANTIDAD FROM


tabla_de_productos A
INNER JOIN items_facturas C ON A.CODIGO_DEL_PRODUCTO = C.CODIGO_DEL_PRODUCTO
INNER JOIN facturas B ON C.NUMERO = B.NUMERO;

SELECT A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA) AS ANO, SUM(C.CANTIDAD) AS CANTIDAD


FROM tabla_de_productos A
INNER JOIN items_facturas C ON A.CODIGO_DEL_PRODUCTO = C.CODIGO_DEL_PRODUCTO
INNER JOIN facturas B ON C.NUMERO = B.NUMERO
GROUP BY A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA)
ORDER BY A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA);COPIA EL CÓDIGO

3) Luego de que ejecutes estas consultas, una a una, notarás que durante cada ejecución , el
tiempo de la consulta se demora un poco más ya que las mismas van exigiendo más
procesamiento de la base de datos:

4) A través del símbolo del sistema de Windows, accede al directorio de MySQL:

cd\
cd "Program Files"
cd "MySQL"
cd "MySQL Server 8.0"
cd BinCOPIA EL CÓDIGO
5) En seguida, accede a la interfaz de línea de comando de MySQL (la contraseña del usuario
root será necesaria):

mysql -uroot -pCOPIA EL CÓDIGO

6) Al estar dentro de la interfaz de línea de comando de MySQL, digita:

EXPLAIN SELECT A.CODIGO_DEL_PRODUCTO FROM tabla_de_productos A;COPIA EL CÓDIGO

7) Observarás algunos indicadores que reflejan el costo de ejecución de esta consulta:

8) Para visualizar el plan de ejecución en otro formato, digita:

EXPLAIN FORMAT=JSON SELECT A.CODIGO_DEL_PRODUCTO FROM tabla_de_productos A \G;COPIA


EL CÓDIGO
De esta manera, obtendrás el plan de ejecución de esta consulta y el parámetro cost_info que
expresa el costo para la resolución de esta query (En este caso, 4.50).

9) Veamos el costo de una nueva consulta. Digita:

EXPLAIN FORMAT=JSON SELECT A.CODIGO_DEL_PRODUCTO, C.CANTIDAD FROM tabla_de_productos A


INNER JOIN items_facturas C ON A.CODIGO_DEL_PRODUCTO = C.CODIGO_DEL_PRODUCTO \G;COPIA
EL CÓDIGO

Aquí, el costo de la consulta aumentó a 77082.36 de acuerdo con el plan de ejecución. O sea,
miles de veces en relación con la consulta anterior. Es sorprendente, ¿Verdad?

10) Veamos el costo de una última consulta. Digita:

EXPLAIN FORMAT=JSON SELECT A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA) AS ANO,C.CANTIDAD


FROM tabla_de_productos A INNER JOIN items_facturas C ON A.CODIGO_DEL_PRODUCTO =
C.CODIGO_DEL_PRODUCTO INNER JOIN facturas B ON C.NUMERO = B.NUMERO \G;COPIA EL
CÓDIGO
El costo aumentó aún más (360123.73). Esto quiere decir que, mientras las consultas a las tablas
involucren Joins, el costo de procesamiento aumentará sustancialmente. Uno de los principales
desafíos del DBA es el de auxiliar al analista de modo que sus consultas sean menos costosas y
consecuentemente más rápidas.

Una vez más les saludo, alumnos y alumnas, y en esta ocasión vamos a hablar un poco más
sobre los índices. Vamos a conocer el concepto de índice. El índice es una entidad dentro de
nuestra base de datos que nos permite facilitar la búsqueda de información al interior de la tabla.
Lo hace más rápido. Pensemos por ejemplo en una palabra, si nosotros tratáramos de buscar esa
palabra en un libro hoja por hoja.

[00:38] Entonces, si no tenemos un índice que nos permita encontrar esa palabra o esa
expresión, nos vamos a demorar mucho tiempo. Entonces cuando no contamos con una
estructura de índice es como si nosotros tuviéramos un libro con palabras pero no existiera el
diccionario.

[00:59] Si tuviéramos un libro con palabras y quisiéramos buscar una palabra en específico,
tendríamos que ir hoja por hoja, hasta encontrar la palabra que estamos buscando y su
definición. En cambio, cuando tenemos un diccionario, ¿cómo usamos el diccionario? Ya
sabemos que están todas las palabras ordenadas de forma alfabética, en orden alfabético.

[01:22] Entonces si necesitamos una palabra, por ejemplo paralelepípedo, ya sabemos que
tenemos que ir hasta la letra P, y ahí en la letra P, buscamos donde está la P con la A. Después
avanzamos donde viene la R y así sucesivamente hasta que encontramos la palabra
paralelepípedo.

[01:42] Entonces lógicamente va a ser mucho más ágil nuestra búsqueda, más rápida, que si
nosotros fuéramos a buscar una palabra en un libro que no es un diccionario para hallar su
definición. Esta sería más o menos una analogía para entender la importancia de los índices.
Entonces, en computación es lo mismo.

[02:04] Si no hay una estructura de índices, esto quiere decir que el costo de procesamiento para
recorrer toda la tabla hasta hallar este registro va a ser muy alto. Entonces vamos a hablar
primeramente del índice en una tabla MyISAM. Pensemos en la siguiente tabla que tiene los
siguiente libros, los títulos de esos libros y sus respectivos autores.

[02:28] En MyISAM, si yo quiero crear índices para MyISAM, entonces cada uno de los
campos o el campo que va a ser el índice, va a ser una nueva estructura que estará almacenando
como referencia la posición del registro en la tabla original.

[02:50] Piensen en lo siguiente. Tenemos una, digamos como índice si tomamos el campo ID
como índice entonces MyISAM va a crear una estructura adicional que va a decir: este primer
registro cuyo ID es 23-4567-8, entonces va a venir a esta tabla auxiliar y va a tomar como
referencia el número 1, porque está en la posición 1 de mi tabla original y así sucesivamente.

[03:25] Entonces el segundo registro está en la posición 2, lo almacena. El tercer registro 89-
0123-4 está en la tercera posición. Ahora bien, si él quiere tomar como índice el campo de título,
entonces lo mismo. Va a almacenar este primer título, con la referencia 1 porque es la posición
que corresponde y así sucesivamente con los demás títulos.

[03:55] Si queremos como índice el autor, entonces es lo mismo. Toma y anota el lugar de la
posición de la tabla donde está ese autor en la tabla original y lo almacena en una referencia.
Entonces, en MyISAM, nosotros obtenemos, digamos una estructura adicional cada vez que se
crea, se genera una estructura adicional cada vez que se quiere buscar un elemento al interior de
la tabla.

[04:27] Entonces esta estructura auxiliar, vamos a decir así, almacena un número de referencia
que corresponde con el lugar o la posición del registro en la tabla original. Entonces si queremos
encontrar este título, la consulta va a ser primero venir acá, donde está título, y ver dónde está la
referencia y ahí si, vuelve y nos devuelve la información. Ah, está en la línea número 1.

[04:59] Y ya aquí viene, lógicamente se organiza, después de salir de la estructura original,


viene y se organiza aquí, pues lógicamente los números van antes de las letras. Y aquí en orden
alfabético y aquí nuevamente organiza de acuerdo con el número. Pero aquí sigue su estructura
natural. ¿Qué consideraciones debemos tener sobre MyISAM?

[05:23] Siempre que hagamos una modificación en la tabla original, todos estos índices se van a
tener que actualizar. Digamos que yo incluya un nuevo libro, entonces todos mis índices aquí
van a tener que actualizarse y todo eso va a generar una demora en el tiempo de procesamiento,
lo que implica un desempeño menor.

[05:52] Pensemos en millones de libros, si tengo que introducir un nuevo libro y tengo varios
índices en mi tabla, entonces va a haber más tiempo de ejecución. Entonces esta sería una
consideración sobre MyISAM, las tablas MyISAM. Ellas generan estructuras auxiliares para el
campo que va a ser índice.
[06:16] Ahora bien, cuando hablamos sobre una tabla InnoDB, ya está un campo que va a ser la
clave primaria. Entonces el índice, esta vez, ya no va a depender tanto como de una estructura
auxiliar, sino que ya en la misma tabla, en la tabla con los datos originales, la clave primaria se
convierte en el mismo índice y ya la información está organizada de modo que el acceso a los
datos va a ser mucho mas ágil, mucho más rápida.

[06:52] Por eso cuando utilizamos claves primarias, vamos a optimizar el costo de nuestras
consultas, van a ser menos costosas. Entonces ya la información viene ordenada, se digita la
información en la tabla, en el orden que se digite, pero ya automáticamente el campo que es
clave primaria, ya está ordenado. Entonces si queremos trabajar con datos en masa, traer muchos
datos en masa, el hacer estas ejecuciones va a ser mucho más rápido.

[07:24] Porque no tenemos que salir a una tabla auxiliar para buscar una referencia para ahí sí
encontrar la información, sino que todo eso se hace directamente en la misma tabla. Entonces
esto va a tener como resultado una mejora en el desempeño de nuestras consultas. Eso, cuando
nuestra clave primaria es propiamente el índice.

[07:55] Al crear clave primaria en una tabla InnoDB, automáticamente se crea un índice por ese
motivo. Entonces esto agiliza muchísimo nuestras búsquedas. Por eso, la clave primaria es un
campo, como ustedes lo saben, no se puede repetir al interior de nuestra tabla. Porque tampoco
podemos tener por ejemplo dos índices iguales, entonces esto también se complementa con la
integridad de los datos.

[08:26] Por ejemplo, yo no puedo tener dos carros, pensemos en una tabla de vehículos, yo no
puedo tener dos automóviles, dos carros con el mismo número de placa. Entonces facilita mucho
la búsqueda.

[08:39] Ahora bien, si yo quiero usar otros campos como índice, aquí es cuando es ID. ID es mi
propio índice, es muy fácil, muy rápido. Pero si yo quiero usar otro campo, por ejemplo, el título
como índice, entonces mi referencia ya no va a ser una posición en la tabla como tal sino mi
referencia va a ser el ID, que es la clave primaria.

[09:04] Aquí en este caso, por ejemplo yo quiero buscar el título 1984, entonces él va a la
estructura auxiliar donde esta el titulo y ese título tiene asociado así, este número de referencia
que sería la clave primaria.

[09:22] Lo mismo con el siguiente título y el siguiente. Si yo quiero autor, entonces la misma
situación se presenta. Asocia, busca traer el nombre del autor a una estructura auxiliar y esta
estructura auxiliar toma como referencia el ID que es la clave primaria y ahí ya nos devuelve el
resultado de nuestra consulta. Así sucesivamente.

[09:47] Entonces, en términos de comparación entre InnoDB o MyISAM, cuando hacemos la


consulta por el mismo campo que es clave primaria, va a ser mucho más ágil y mucho más
rápida nuestra consulta que cuando por ejemplo hacemos la consulta por una campo que no es
clave primaria, porque ahí sí, el tiempo de ejecución va a ser prácticamente el mismo que con
MyISAM.
[10:16] Entonces las consideraciones que podemos hacer sobre InnoDB son las siguientes. Ya la
tabla viene ordenada automáticamente con la clave primaria, entonces no tiene que hacer
consultas o generar estructuras auxiliares para generar organizarse y hacer las consultas, sino
que ya en la misma tabla se realiza la consulta y esto agiliza mucho el proceso de búsqueda al
interior de la tabla de búsqueda de registros.

[10:40] Esto va a tener una mejora sustancial en el desempeño de las consultas, porque estamos
utilizando la propia clave primaria como índice. Entonces es mucho más rápido, por eso, cuando
nosotros estamos trabajando con estas tablas InnoDB y hacemos consultas, tenemos una
consulta muy grande con muchos registros, entonces va a ser mucho más rápido también la
velocidad para obtener la información o el tiempo para hacer la consulta.

[11:12] El tiempo de query va a ser mucho mejor, mucho más rápido. El costo para hallar los
registros en campos que no sean primary key o clave primaria, en InnoDB entonces sería el
mismo de MyISAM.

[11:24] De modo que básicamente esta sería como la comparación entre MyISAM e InnoDB en
cuanto a los índices. Entonces, esto era lo que les queríamos mostrar. Nos vemos en el próximo
video.

¿Cómo podría perjudicar a una base de datos el hecho de que una tabla contenga muchos
índices?
 Alternativa correta

Muchos índices harán que los comandos de INSERT, UPDATE y DELETE se vuelvan más lentos.
¡Alternativa correcta! Como los índices deben ser reconstruidos cada vez que se modifican los datos de las tablas,
muchos índices sí afectan el desempeño.
 Alternativa correta

Muchos índices harán que el plan de ejecución sea más complejo.


¡Alternativa incorrecta! El número de índices no añade complejidad al plan de ejecución.
 Alternativa correta

Muchos índices harán que la consulta se pierda tratando de descubrir el índice correcto a ser
empleado.

Hola alumnos y alumnas, vamos a continuar aquí retomando un poco el concepto de índices
para poder entrar a hablar sobre algoritmos para la indexación. Entonces, como vimos
anteriormente, en una estructura de tabla MyISAM cuando hablamos de índices, entonces se
crea una estructura separada para índices que sean llave primaria y los que no sean llave
primaria o clave primaria.

[00:28] Entonces crea su estructura y toma como referencia la posición de la fila en la tabla
original. Esta tabla MyISAM, ella puede implementar índices HASH o también B-TREE. Yo les
mencioné en la parte 1 de este entrenamiento que estaríamos viendo detalladamente sobre estos
algoritmos y ahora los vamos a explicar.
[00:58] En InnoDB, entonces, la tabla original ya queda ordenada de acuerdo con primary key.
O sea, el índice y el primary key se encuentran en el mismo lugar en la tabla original. Entonces,
no tiene que crear una estructura separada como en el caso de MyISAM para tomar las
referencias, sino que la propia primary key ya es índice.

[01:24] Y cuando se trata de un índice que no sea primary key, entonces ahí sí crearía una
estructura adicional y tomaría como referencia el valor del primary key que se encuentra en la
tabla. Entonces, en ese sentido se asemejara a la estructura de indexación que trabaja MyISAM.

[01:47] La diferencia principal con InnoDB es que ella únicamente trabaja con indexación B-
TREE. Ahora sí vamos a ver que tanto HASH y B-TREE son algoritmos de búsqueda en listas
ordenadas, facilitan la búsqueda de registros o de filas al interior de una lista ordenada.

[02:11] Para poder hablar de B-TREE tenemos que hablar en primer lugar de un árbol binario.
Un árbol binario es un conjunto de nodos o un nodo que tiene como máximo dos hijos. Al
momento de montar una árbol binario hay que considerar siempre que, a la izquierda del nodo
vamos a tener valores inferiores, y a la derecha del nodo, valores superiores, máximo dos.

[02:42] ¿Qué sucede? Si yo por ejemplo tengo este árbol binario que observan acá, yo tengo mi
nodo central con un valor a la izquierda, tengo un nodo con un valor inferior y a la derecha de
este nodo tengo otro nodo con un valor superior, entonces 27, lógicamente a la izquierda tendría
13, que es un valor menor a 27 y a la derecha del 27 tengo 35, que es un valor mayor que 27.

[03:12] Lo mismo aquí, a la derecha del 13 tengo el 26, que es mayor que 13 y aquí en el nodo
donde está el 35, a la izquierda tengo el 33 y a la derecha el 39. Entonces más o menos ese es el
concepto de árbol binario. ¿Qué pasa? Él va creciendo pero nada me garantiza que la cantidad
de nodos, tanto para la izquierda como la derecha van a ser iguales. Entonces por eso llega el B-
TREE.

[03:46] Antes de ir más allá y hablar de B-TREE, vean ustedes, si yo quiero hallar el 33,
entonces vengo aquí a mi nodo central 27, ¿33 es menor que 27? No, entonces no es por acá. ¿El
33 es mayor que 27? Sí, listo. Entonces vengo a este nodo. Aquí tengo el 35. ¿33 es mayor que
35? No, entonces no es por este camino.

[04:08] ¿33 es menor que 35? Sí, me vengo por este camino y llegué directamente al 33
entonces ahí ya paro de buscar. Si voy a buscar el 27, pues ya no tengo que bajar por ese árbol
binario sino que ya me quedo en el 27. Hablando ahora sí de B-TREE, B-TREE es un árbol
binario balanceado.

[04:28] Entonces tanto a la izquierda como a la derecha, este algoritmo se encarga de cerciorarse
que hay la misma cantidad de nodos, de modo que el árbol va a crecer de forma equilibrada por
todos sus caminos, como se observa aquí en la gráfica.

[04:51] Entonces si por ejemplo yo tengo 4 billones de registros, eso quiere decir que yo voy a
tener máximo 32 niveles para ir consultando. Pensemos en 2 elevado a la 32. Entonces estamos
hablando de 4 billones y alguna cosa. Entonces, si yo tengo 4 billones de registros repartidos en
32 niveles, si yo voy a buscar un número, por ejemplo el número 1350, yo como tengo 4
billones, generalmente ese nodo central va a ser la mediana, que sería 2 billones.
[05:40] Entonces ya viene y hacia la izquierda tendría un número inferior a 2 billones, que sería
1 billón, y hacia la derecha tendría un número superior a 2 billones, que sería 3 billones.
Entonces 1350 está por el camino de 1 billón. Después en un billón, a la izquierda de un billón
voy a tener 500 millones y a la derecha voy a tener 1.5 billones.

[06:08] Entonces tendría que ir por el camino de la izquierda, 500 millones y después así ir
descendiendo nivel a nivel, hasta llegar donde se encuentra el 1350. O sea, máximo voy a hacer
32 consultas. Estoy hablando de 1350 no van a ser ni siquiera 32 consultas, tal vez sean 20
consultas o 21 consultas para llegar hasta ese valor. Entonces es matemáticamente más eficiente
trabajar con un algoritmo B-TREE de árbol binario balanceado, porque mi tiempo
computacional va a ser mucho menor.

[06:46] Yo voy bajando por estos nodos y máximo tengo que hacer un número ya conocido de
consultas para llegar al valor. Eso es diferente a ir en 4 billones de registros, ir preguntando
¿Este es el número? No. Siguiente. ¿Este es el número? No, el siguiente. Sería un paso a paso, se
tendrían que hacer 4 billones de consultas para llegar al número, por ejemplo si se encontrara en
el último lugar.

[07:10] La idea es realmente agilizar esta consultas. Entonces B-TREE es un algoritmo que
facilita esto. Vamos a tomar aquí un ejemplo un poco más sencillo. Él trabaja también creando
un conjunto de valores.

[07:26] Él coloca un intervalo semejante entre ellos o el mismo intervalo entre ellos utilizando
también una algoritmo llamado D y 2D, y cada intervalo de esos se conoce como D, entonces
aquí digamos, entre el 256 y 512 yo sé que tengo 256 valores también. Entre 512 y 768, tengo
256. Aquí a la izquierda en 256, entonces yo tengo otro conjunto de números u otro conjunto de
nodos que tienen intervalos semejantes entre ellos.

[08:07] También en el intermedio del 256 y el 512 tengo otro conjunto de valores que tienen el
mismo intervalo entre ellos. Entre 768 y lo que viene acá tengo otro intervalo de valores antes
de llegar por ejemplo al 1024. ¿Qué sucede? Aquí, sí estoy buscando el número 128, ya se que
va a estar en esta región y ya me lo encuentro aquí de una vez.

[08:42] Si estoy buscando el número 320, entonces sé que está entre el 256 y el 512. Si estoy
buscando el 256, ya estoy aquí en el 256. Entonces por ejemplo si tengo el 339, el camino que él
va a seguir es dentro de este intervalo, baja y entre 320 y 384 tengo 64 y entre 384 y 448
también tengo 64.

[09:09] Entonces entre 384 y 320, también mi mitad sería 32, entonces 320 va estar entre 352 y
así sucesivamente vamos bajando. Recordemos que son 32 niveles, 2 elevado a la 32, estos son
intervalos semejantes. Estoy dando un ejemplo para comprenderlo más fácil y sé que este 339
esta por aquí en algún lugar más abajo en el árbol binario.

[09:38] Entonces más o menos esto es el concepto de B-TREE, es muy fácil que el computador
realice las búsquedas porque él sabe exactamente en cuáles intervalos ir realizando sus consultas
de acuerdo con el lugar donde se encuentra este nodo.
¿Cuál es el mecanismo de almacenamiento en las tablas MySQL que puede trabajar con HASH
y B-Tree?
 Alternativa correta

Los mecanismos de almacenamiento en las tablas de MySQL solo trabajan con HASH.
¡Alternativa incorrecta! Existe un mecanismo que trabaja con estos dos algoritmos de indexación.
 Alternativa correta

InnoDB.
 Alternativa correta

MyISAM.
¡Alternativa correcta! Las tablas MyISAM ofrecen soporte para HASH y B-Tree.

Ahora vamos a hablar un poco de HASH. Ya vimos B-TREE y ahora hablaremos de HASH.

[00:07] El algoritmo HASH es un poco más complicado, porque de hecho hay cosas que este
algoritmo realiza, la función realiza utilizando un checkSum y otros elementos para generar un
nuevo valor o una palabra HASH, vamos a llamarla así, con la información como con un
sumario de lo que contiene la palabra original. Así sería mas o menos una forma de visualizarlo.

[00:30] Entonces mapea datos grandes de tamaños variables en una palabra de tamaño fijo. Por
ejemplo, yo tengo aquí todos estos datos y me los almaceno en esta palabra aquí que tiene este
string, no veamos estos números como números sino como un string. Aquí esta palabra muestra
estos datos, son de menor longitud pero igual tengo una palabra con la misma cantidad, todo de
acuerdo con los parámetros que se establecieron para crear este HASH.

[01:03] Aquí abajo, lo mismo, todos estos tienen, vean, 4, 8, 12, son palabras de 12 caracteres.
¿Cómo podemos observar el algoritmo HASH? Supongamos que tenemos un libro y queremos,
en este libro, llegar a un punto específico del libro. ¿Qué hacemos?

[01:32] Vamos al índice, en el índice vamos a encontrar los temas que hay en cada lugar del
libro y en cada tema, vamos a encontrar subtemas y así vamos a llegar más específicamente al
capítulo o subcapítulo que queremos encontrar dentro del libro.

[01:52] Entonces vemos aquí el capítulo y vemos la página en la cual está y después nos
dirigimos hacia la página. Entonces es una forma sencilla de buscar porque también es como
tomar el índice de un libro. Es eso, tomar el índice del libro para yo encontrar el tema que deseo
consultar.

[02:16] HASH es muy utilizado, no solamente para indexación, sino lógicamente para la parte
de criptografía, almacenaje de contraseñas, criptomonedas, precisamente porque es una función
un poco matemática que envuelve ciertos parámetros y es bastante útil en ese sentido.
[02:41] Entonces, veamos lo siguiente. Cuando usamos HASH entonces yo tengo un bucket, que
serían como espacios de memoria. Tengo estos diferentes espacios de memoria y aquí hay como
un conjunto, aquí otro conjunto, otro conjunto y pensemos en estos conjuntos como páginas del
libro o capítulos del libro.

[03:05] Entonces aquí todos estos capítulos que hay por aquí entonces se relacionan, los que hay
aquí también. Tengo una serie de registros, su ID, con su nombre. ¿Entonces qué sucede?

[03:17] Tengo mi función HASH que es difícil, a pesar de ser una función matemática, a veces
de repente es un poco complicada de entender cuáles son los procedimientos que realiza en su
interior. Pero la función HASH lo que hace es distribuirme cada uno de mis registros en un
espacio de memoria que se encuentra en cada uno de sus buckets.

[03:43] Entonces por ejemplo, este ID o registro que hay aquí, viene y lo almacena dentro de
este bucket. Antiguamente recordemos que se encontraban sin nada y ahora ya almacena un
espacio de memoria. Lo mismo este otro registro, el 234 viene y se almacena aquí en este
espacio de memoria. Estos dos vienen y se almacenan en este espacio de memoria, no hay
ningún inconveniente.

[04:13] Él toma la información y la lleva a un espacio de memoria y este espacio ya le genera


una palabra llamada HASH. Entonces ya aquí, en este espacio de memoria va a quedar
almacenada una palabra HASH que contiene la información del registro que queremos.

[04:33] Entonces aquí, ese espacio de memoria contiene mi registro como tal, pero queda
almacenado con una palabra HASH. Si por ejemplo yo quiero buscar aquí, en estos espacios de
memoria yo sé que tanto Pedro Acosta como Juan Estrada, como Ramon Gutiérrez se
encuentran dentro de este grupo de buckets que está aquí.

[04:57] Es como si yo dijera en mi libro, en mi índice, que estos tres registros de alguna forma
se relacionan entre sí, entonces están en este conjunto. Entonces como ustedes pueden ver aquí,
en el espacio 78 yo tengo dos registros. No hay ningún inconveniente, él me los almacena y
estas palabras HASH hacen referencia al mismo bucket, no hay ningún inconveniente.

[05:21] Como les mencioné, es un poco más complejo de entender el algoritmo HASH pero
también facilita la búsqueda porque viene a un lugar específico de memoria y trae la
información. La lleva a un lugar específico de memoria, le da una palabra HASH y ahí está la
información y después nuevamente cuando se quiere consultar, busca ese espacio de memoria
asociado a la palabra HASH y tenemos la información que necesitamos.

[05:48] Entonces es básicamente esto lo que les quería hablar sobre el algoritmo HASH y el
algoritmo B-TREE. Cuando hablamos de tablas MyISAM, recordemos que podemos trabajar
con indexación HASH o con indexación B-TREE, y cuando hablamos de InnoDB, únicamente
trabajamos con índices B-TREE.

[06:10] En el próximo video estaremos entonces analizando un poco más los elementos que
hemos venido aprendiendo a lo largo de este entrenamiento de forma práctica. Ya nos vemos.
¿Cuál es el algoritmo que genera un árbol binario balanceado?
 Alternativa correta

El algoritmo HASH.
 Alternativa correta

El algoritmo B-Tree.
¡Alternativa correcta! Este es el algoritmo que genera árboles binarios balanceados.
 Alternativa correta

El propio algoritmo de árboles binarios ya se genera de forma balanceada.


¡Alternativa incorrecta! El árbol binario no se preocupa por el balanceamiento del mismo.

Hola a todos y a todas, vamos a continuar entonces aquí estudiando y haciendo un recuento de
lo que hemos venido aprendiendo a lo largo de esta segunda parte del entrenamiento de
administración de MySQL.

[00:13] Ya vimos sobre el plan de ejecución que nos ayuda a entender mejor de qué manera
MySQL está realizando los queries para poder auxiliar a nosotros como DBA, a un analista a
que sus queries sean más eficientes.

[00:26] Y después vinimos a hablar un poco sobre los índices o indexación, que el índice nos
ayudaba a tornar la búsqueda de nuestros registros más ágil, más rápido.

[00:38] Porque entonces ya era simplemente encontrar el registro y cuando esa búsqueda era a
través de la clave primaria, entonces por ejemplo en el caso de InnoDB, no había que crear una
estructura auxiliar con otra referencia, sino que simplemente dentro de la misma tabla, de la
tabla original, ya a través de la primary key ya estaba toda la información ordenada y era mucho
más rápido realizar la consulta.

[01:02] Entonces vamos a hacer aquí un ejercicio a través del símbolo del sistema, en el cual
estaremos viendo cómo el índice puede mejorar muchísimo el tiempo de query, porque a veces
el analista dice: "no, yo tengo que realizar un informe, pero ese informe demora siglos en esta
lista". Entonces vamos a ver si trabajar con el índice puede ayudar en ese sentido.

[01:30] Hagamos el siguiente query: SELECT * FROM FACTURAS. Vamos a colocar una
condición de filtro: WHERE FECHA_VENTA = '20170101'; la ejecutamos. Entonces nos
devuelve aquí la información, perfecto, todos los datos de la fecha de la venta. Si yo le doy a
esto un EXPLAIN FORMAT=JSON y la misma query, que sería SELECT * FROM
FACTURAS WHERE FECHA_VENTA='201170101' y le colocamos \G; ejecutamos, entonces
nos devuelve nuestro JSON.

[02:51] Y "query_cost": "8849.05". Perfecto. Entonces voy a tomar aquí en Sublime text. Y voy
a copiar todo este query, vamos a decirle aquí que el costo es 8849.05 de este query de esta
forma. Ahora yo voy a usar el índice y voy a crear un índice. ¿Entonces cómo hago para crear el
índice? Entonces yo pongo ALTER TABLE FACTURAS ADD INDEX() y el nombre del
campo que quiero como índice, que es (FECHA_VENTA). lo ejecuto.

[03:57] De esta forma yo le estoy diciendo a mi tabla que quiero modificarla y que quiero que
ahora el campo fecha_venta se vuelva un índice. Lo ejecutamos. Nos dice ok, lo hizo. Ahora
generemos nuevamente este JSON y vamos a explicarlo. Noten ustedes qué sucedió.

[04:23] "query_cost": "54.05". Vean. Entonces voy a copiar todo este código porque esto es muy
importante, copiar esta parte del código, voy a Sublime text y lo voy a escribir aquí. Después de
hacer un ALTER TABLE. Bien. Entonces después de hacer esto, y si hago la misma consulta, el
costo va a ser, mi costo va a ser "54.05".

[05:13] ¿Cómo logramos nosotros ir de 8849 a 54? Se redujo el costo de una forma muy notoria.
¿Pero cómo podemos explicar esto a través de nuestro JSON? ¿Qué sucede? En la primera
consulta, él simplemente vino aquí y "access_type", donde dice aquí "acces_type" dijo: acceso
todo. Examinó todos los 87768 registros y entonces ahí empezó a hacer todo su query.

[05:51] En el segundo, después de yo crear el índice, ¿qué él hizo? "access_type" a traves de


"ref", entonces ya encontró una referencia, "possible_keys": [ "FECHA_VENTA". Entonces ya
mi campo FECHA_VENTA, como se volvió índice, entonces ya utilizó esta "key":
"FECHA_VENTA".

[06:11] Vino rápidamente y encontró, examinó 74. Vean ustedes qué interesante. Entonces
lógicamente el examinar 74 a 87768, es una diferencia grande. Entonces, el hacer esto ayuda,
auxilia muchísimo, en el tiempo de consulta, en el tiempo de query. Por ejemplo podemos
observar que cuando establecemos como índice nuestra condición de filtro, vamos a facilitar
muchísimo el resultado o el costo de nuestra consulta y va a ser mucho más ágil.

[06:53] Voy a mostrarlo nuevamente y vamos a eliminar el índice que creamos. Entonces
ALTER TABLE FACTURAS, le vamos a decir DROP INDEX, para que ustedes vean que
realmente el índice sí afecta. El índice FECHA_VENTA. El crear un índice tiene mucho efecto
en el costo.

[07:20] Entonces lo eliminamos y yo nuevamente le doy el EXPLAIN, el mismo EXPLAIN


pero ya esta vez sin el índice y vean ustedes. Nuevamente 9065. Es un valor muy cercano al que
tuvimos anteriormente.

[07:35] Pero la idea es que nosotros ya sepamos así de entrada que el tener un índice o el
generar un índice tomando como referencia la condición de filtro, entonces vamos a mejorar
muchísimo nuestra consulta. En el costo al eliminar el índice va a ser nuevamente de 9065.80.
Entonces es un valor parecido con el 8849.

[08:13] No es igual, pero sigue siendo un valor alto. Entonces lo que queremos decirles a través
de esto, nuevamente, tuvo que examinar, como no encontró acceso todo y como no encontró una
referencia, entonces tiene que examinar toda la tabla.
[08:30] Imaginémonos una base de datos con millones de registros. Vean ustedes cómo
podemos entonces hacer que un informe que demore siglos en generarse en cuestión de minutos,
poquitos minutos, o segundos. Vamos a ser optimistas.

[08:50] Entonces por eso es tan importante trabajar con nuestros índices a la hora de optimizar
el desempeño de nuestras tablas o de la búsqueda en nuestros registros y de nuestras consultas
en MySQL. Era eso lo que les queríamos mostrar. Nos vemos en el próximo video.

Observa la siguiente consulta:


SELECT A.ID, B.ID, A.NOMBRE, B.NOMBRE FROM TABLA A

INNER JOIN TABLA B WHERE A.ID = B.ID

WHERE B.NOMBRE = 'JUAN';COPIA EL CÓDIGO

Considerando que las tablas anteriores no tienen claves primarias ni externas.

¿Cuáles índices debemos construir para mejorar esta consulta?

 Alternativa correta

TABLA A ID
TABLA B ID
TABLA A NOMBRE
TABLA B NOMBRE
¡Alternativa incorrecta! No es necesario crear un índice para el campo NOMBRE de la TABLA A.
 Alternativa correta

TABLA A ID
TABLA B ID
TABLA B NOMBRE
¡Alternativa correcta! Estos son los índices. Usamos índices para los campos que hacen parte de la igualdad de
los JOIN y el que está en el criterio de filtro WHERE.
 Alternativa correta

TABLA A ID
TABLA B ID
¡Alternativa incorrecta! Falta incluir un campo para mejorar el desempeño de esta consulta.

Llegó la hora de que sigas todos los pasos realizados por mí durante esta clase. Si ya lo has
hecho ¡Excelente! Si todavía no lo has hecho, es importante que ejecutes lo que fue visto en los
vídeos para que puedas continuar con la próxima aula.

1) A través del símbolo del sistema de Windows, accede al directorio de MySQL:

cd\
cd "Program Files"
cd "MySQL"
cd "MySQL Server 8.0"
cd BinCOPIA EL CÓDIGO

2) En seguida, accede a la interfaz de línea de comando de MySQL (la contraseña del usuario
root será necesaria):

mysql -uroot -pCOPIA EL CÓDIGO

3) Al estar dentro de la interfaz de línea de comando de MySQL, digita:

SELECT * FROM FACTURAS WHERE FECHA_VENTA='20170101';COPIA EL CÓDIGO

4) Ahora, vamos a analizar el plan de ejecución de este comando:

EXPLAIN FORMAT=JSON SELECT * FROM FACTURAS WHERE FECHA_VENTA='20170101' \G; COPIA EL


CÓDIGO

El costo de esta consulta fue de 9065.80.

5) Para mejorar esta consulta, una de las maneras más efectivas es creando un índice para el
campo empleado como criterio de filtro. Para nuestro caso, el campo que queremos modificar
es FECHA_VENTA. Digita y ejecuta:
ALTER TABLE FACTURAS ADD INDEX(FECHA_VENTA);COPIA EL CÓDIGO

6) Analicemos el plan de ejecución de la query anterior después de crear el índice. Digita y


ejecuta nuevamente:
EXPLAIN FORMAT=JSON SELECT * FROM FACTURAS WHERE FECHA_VENTA='20170101' \G; COPIA EL
CÓDIGO

¿Cuál es el costo que obtuviste para esta consulta?

7) En efecto, el costo de la consulta se redujo considerablemente debido a que la búsqueda de la


información está siendo realizada mediante el índice. No es necesario recorrer toda la tabla, sino
que ya el índice está allí facilitando el procesamiento de la información:

8) Ahora, eliminemos el índice del campo usado como criterio de filtro a través del siguiente
comando para verificar si realmente el índice hace la diferencia a la hora de realizar nuestras
consultas:

ALTER TABLE FACTURAS DROP INDEX FECHA_VENTA;COPIA EL CÓDIGO

9) Analicemos una vez más el plan de ejecución:

EXPLAIN FORMAT=JSON SELECT * FROM FACTURAS WHERE FECHA_VENTA='20170101' \G; COPIA EL


CÓDIGO
¿Cuál fue el costo obtenido después de eliminar el índice?

Hola, alumnos y alumnas, ya entonces hemos utilizado el símbolo del sistema o la línea de
comando, el command prompt para poder consultar el plan de ejecución, para ver el tema de
cómo se mejora un índice y vamos ahora a ver cómo se puede hacer esto a través de Workbench.

[00:24] Es un ambiente visual un poco más amigable y vamos a crear aquí un nuevo script. Si
ustedes recuerdan, nosotros realizamos las siguientes consultas, las voy a copiar de uno de los
videos anteriores y las voy a pegar acá. Vamos a visualizarlas. La idea es que podamos por
ejemplo observar que aquí también podemos utilizar los mismos comandos.

[01:03] Si yo le doy por ejemplo aquí EXPLAIN SELECT, esta primera consulta, entonces él
me vuelve los misma tabla que observamos en el command prompt, pero si le doy EXPLAIN
FORMAT=JSON y lo ejecuto de nuevo, me va a devolver un resultado pero ya no es tan
amigable. Tendría que yo ir agrandando ese espacio y no está indentado.

[01:40] Por ejemplo aquí puedo ver el query cost, si yo le doy un zoom acá, entonces ustedes
observan query_cost "4.50" y aquí mas o menos aparece, en esa pequeña tabla auxiliar también
una forma de visualizarlo, pero así queda muy difícil. De todas maneras no es tan práctico como
verlo en el command prompt.

[02:04] ¿Qué podemos hacer? Hay una manera, aquí en Workbench de yo visualizar lo que hace
mi comando EXPLAIN de forma gráfica y así nos dirigimos hacia la parte inferior donde dice
execution plan.

[02:21] Venimos aquí, se repitieron los comandos, voy a seleccionar. Voy a ejecutar y le doy
aquí donde dice execution plan. Entonces noten ustedes que me aparece un Full index Scan.
Como la tabla de productos es tan pequeña, entonces el hacer este scan directamente va a ser
muy ágil, muy rápido.

[02:50] Pero si vengo acá a la siguiente query que ya tiene un INNER JOIN y la ejecuto y reviso
todo nuevamente, en la parte inferior aquí en execution plan, al principio hace este Full index
Scan, tiene un costo y después, aquí después de hacer este, en el código del producto, que aquí sí
hay key, entonces revisa de la 76000 líneas, 7350, entonces aquí hay una mejora.

[03:29] El costo total sería 76000. ¿Qué sucede? Ya tiene un costo superior, entonces lo mismo,
si yo hago la siguiente consulta, la que tiene ya otros joins. La ejecuto y veo el plan de
ejecución. Ya tengo otros en este loop y va a aumentando. Ya el valor es 260000. Vamos a darle
un zoom acá para tratar de observar mejor.

[04:05] 260703 y aquí está 211000, bueno, son costos altos, a pesar de que aquí donde está
verde, él encuentra referencias, y aquí donde está rojo, hace un access_type all. Access type all y
aquí dice access type ref, entonces eso facilita porque ya está viendo a través de llaves.

[04:35] ¿Entonces qué sucede? Yo puedo tomar estas consultas y crear nuevas tablas sin índices,
para ver cómo va a cambiar el costo de la consulta. Voy a tomar tabla de facturas, le doy clic
derecho sobre facturas. Send to SQL editor y create statement. Aquí es donde está todo esto de
llave primaria, keys y constraints, todo esto la voy a eliminar y lo voy a llamar 'facturas1'.

[05:18] También voy a crear la tabla de ítems facturas, lo mismo, clic derecho sobre ellas, send
to sql editor, create statement y elimino toda esta información referente a claves primarias y
claves foráneas o extranjeras. Y también voy a tomar el siguiente que sería la tabla de productos,
clic derecho, sent to sql editor, create statement y lo mismo.

[05:55] Eliminamos la clave primaria. Perfecto. Vamos a ejecutar todos estos códigos, es este y
este. Es 1, lo vamos a llamar 'items_facturas1', ejecutamos y 'tabla_de_productos1'. La otra ya
existía, no la podíamos volver a crear. Estaba. Vamos a ver si facturas las creó. Ya existe. Creó
'facturas1', 'items_facturas1' y 'tabla_de_productos1'. Ahora vamos a insertar.

[06:44] INSERT INTO facturas1. Otro, SELECT * FROM FACTURAS. Entonces colocamos
toda la información de facturas en la tabla facturas1. Entonces 87800 filas. Lo mismo, INSERT
INTO items_facturas1. Todo lo de ítems facturas. SELECT * FROM items_facturas.
Ejecutamos también.

[07:42] Son 213000 filas y ahora productos. INSERT INTO, sería tabla_de_productos1,
SELECT*FROM tabla_de_productos1; entonces ya creamos nuestras tablas, que serían
parecidas, la diferencia es que no tiene ni claves primarias ni claves foráneas.

[08:38] Ahora yo voy a tomar la mismas consultas anteriores y en vez de hacer la consulta en
tabla de productos voy a hacer la tabla_de_productos1 y vamos a cambiar aquí, facturas1,
tabla_de_productos1, facturas1 y aquí items_facturas1. Vamos a modificar todo eso para que
estas consultas las realicemos en estas tablas que acabamos de crear sin claves primarias y sin
claves foráneas.

[09:19] Bien. Vamos a ejecutar entonces este primero. Presionamos el rayo, vemos el plan de
ejecución. Entonces todo esto 375, no cambió mucho. Ahora veamos este que ya tiene un
INNER JOIN. Recordemos, no tenemos ni la clave primaria. La clave primaria es un campo
cuyo registro no se puede repetir en ninguna otra parte de la tabla, entonces no tiene clave
primaria.

[09:55] La clave foránea o externa es el campo que relaciona una tabla con otra, entonces no hay
clave externa tampoco. Entonces si yo vengo al execution, vean ustedes. En ambos casos hizo
un full table scan y access type all, fue leyendo todos los registros y costo, vean ustedes 747020.
Entonces voy a poner aquí, pasó de 60000 a 747020.43. Veamos la siguiente consulta.

[10:47] Minimicemos aquí un poco. Ya vimos esta 747020, esta de aquí, la siguiente.
Ejecutamos y veamos el plan de ejecución. Vean cómo cambia, ya el plan de ejecución es una
cosa absurda, aparece ni siquiera puedo leer este número. 6552109371. Entonces pongamos aquí
6 billones. ¿Qué queremos mostrar con esto?

[11:49] Que realmente el hecho de no tener una clave primaria y no tener una clave externa, va a
perjudicar notablemente el desempeño de las consultas. Vamos a ejecutar esta última, solo para
observar que el costo va a ser también una cosa altísima. Lo mismo, 6552200 y bueno, al hacer
el GROUP BY y ORDER BY, ya no hay ningún tipo de modificación.
[12:26] En la anterior, que la ejecutamos, no hicimos GROUP BY ni ORDER BY. Pero ya
realmente como se ha gastado todo el tiempo aquí, al hacer el GROUP BY y ORDER BY, ya
está la información de cierta forma en un lugar de fácil acceso. Entonces no tiene costo adicional
el realizar GROUP BY y ORDER BY.

[12:48] Pero la consulta es muy elevada, el costo de la consulta es 6552109371. Entonces lo que
queremos dejar saber con todo esto es que el hecho de no tener una clave primaria y una clave
externa va a hacer que nuestra consultas y el desempeño, nuestros queries sea menor.

[13:24] Entonces la idea es que siempre busquemos optimizar nuestras consultas a través del uso
de índices, claves primarias y claves externas. En el próximo video vamos a estar entonces
observando, o trabajando mejor, con una herramienta que nos permitirá simular diversas
conexiones concurrentes para ver cómo una consulta puede mejorarse u optimizarse haciendo
ciertas modificaciones a las tablas.

[13:59] Nos vemos en el próximo video, estaremos hablando específicamente de MySQLSLAP.

Cuando vemos un rectangulo de color verde en el plan de ejecución, ¿Qué significa?


 Alternativa correta

Que aquel Table Scan está usando un índice.


¡Alternativa correcta! Esto es exactamente lo que indica el color verde en los rectangulos.
 Alternativa correta

Nada. Los colores sirven solamente para diferenciar los Table Scans, cuando la consulta involucra
más de una tabla.
¡Alternativa incorrecta! Los colores sí tienen un significado.
 Alternativa correta

Que aquel Table Scan no está usando un índice.


¡Alternativa incorrecta! Esto no es lo que el color verde representa.

Bueno, les saludo una vez más y continuando aquí con nuestro tema de desempeño para
finalizar, vamos a hablar de una herramienta llamada MySQLSLAP que nos permite simular
diversas consultas realizadas de forma concurrente, o sea, al mismo tiempo cómo se
comportarían ciertas consultas realizadas al mismo tiempo a nuestras tablas.

[00:26] Vamos entonces a crear aquí un nuevo script y ustedes recuerdan que nosotros hicimos
una consulta. SELECT * FROM facturas la hicimos previamente, utilizando la condición de
filtro. WHERE FECHA_VENTA='20170101'. Hicimos esta consulta y al ver aquí el plan de
ejecución, ella hizo un full scan y el costo de ella fue 8893.81.

[01:08] Lo voy a escribir aquí. Esto es sin utilizar lógicamente fecha venta como índice. Aquí
está haciendo un full scan porque la condición aquí dice access type all, está accediendo a toda
la tabla, revisando registro por registro. Entonces es más demorado.
[01:32] Entonces, antes de ir más allá vamos a hacer esta operación, ALTER TABLE facturas
ADD INDEX(FECHA_VENTA); y quiero que el campo FECHA_VENTA sea índice.
Ejecutamos y si realizamos nuevamente nuestro SELECT y vemos el plan de ejecución, van a
ver que ya es más rápido y el costo de la consulta es 53.65.

[02:10] Ya el tipo de acceso no es a todo sino a la referencia. Coloquemos aquí el valor -- cost
53.65. ¿Qué pasa si yo hago esta misma consulta anterior pero a la tabla facturas1 que fue la que
creamos previamente sin índices, sin clave primaria, sin clave externa?

[02:45] Vamos a ejecutarla. Si vemos el plan de ejecución, 9028. Costo 9028.13. ¿Qué sucede si
yo, en vez de hacer una consulta, simulo un número determinado de consultas a la base de datos
utilizando estos parámetros? Entonces vamos a realizar estas mismas consultas utilizando la
herramienta MySQLSLAP.

[03:27] Venimos al command prompt, abrimos nuestro símbolo de sistema, está en C:\Program
Files\MySQL\MySQL Server 8.0\bin. Aquí va ser el siguiente comando: mysqlslap -uroot -p --
concurrency=100 --iterations=10 --create-schema=jugos_ventas --query= y aquí dentro vamos a
colocar entre comillas dobles, vamos a colocar nuestra query.

[04:38] Vamos a colocar esta primera query que realizamos aquí, la seleccionamos, "Ctrl + C",
venimos al símbolo de sistema, la pegamos y aquí, al final ;. La ejecutamos concurrency
iterations. Nos pide nuestras contraseñas.

[05:00] Digitamos nuestra contraseña de usuario root y él va a comenzar a simular estas 100
conexiones. Entonces vean ustedes qué interesante. El promedio de segundos para rodar estas
queries es 0.25 segundos, es decir 250 milisegundos. El tiempo máximo para rodar todas las
querys fue 1.094 segundos y el tiempo mínimo, 0.078 segundos o sea 78 milisegundos mínimo y
1.094 segundos el tiempo máximo.

[05:40] ¿Ahora qué sucede si yo ejecuto la misma query anterior pero en la tabla facturas1 que
es la que no tiene índices, ni clave primaria, ni clave foránea ni nada? Presionamos, nos pide
nuevamente nuestra contraseña de root y si ustedes notan, se va a demorar un poco más
haciendo las simulaciones porque ya el costo de la consulta aumenta.

[06:08] No existe una referencia, entonces tiene que accesar todo. Entonces va a ir viendo línea
a línea y noten ustedes, el promedio, aquí salió el resultado para realizar todas las queries, 2.770
segundos o 2.77 segundos.

[06:28] Entonces el tiempo mínimo 2.328 segundos y el tiempo máximo 3.453 segundos. ¿Qué
sucede? Noten ustedes que el tiempo mínimo de query fue más del doble del tiempo mínimo del
query cuando no hay ni índice ni clave primaria ni clave externa o foránea, fue mayor al tiempo
máximo de query cuando sí hay índice.

[07:04] Entonces lo que queremos demostrar con esto es que el desempeño mejora muchísimo a
la hora de utilizar índices en nuestras tablas. Entonces por ejemplo vamos a pensar en estas que
creamos JOINs. ¿Qué puedo hacer? Ya como DBA sucedió esta situación, puedo simular cómo
puedo mejorar, entonces mi base de datos ¿cómo le puedo expresar o dar a conocer al analista
que puede hacer y qué medidas puede tomar?
[07:38] Hay decenas de medidas que se pueden tomar, pero dentro de las principales es los
índices. ¿Qué se puede orientar? Que en nuestras igualdades al momento de hacer los JOINs
estos campos sean índices, o sea claves primarias. Cuando esos campos son claves primarias
recuerden que se crea el índice automáticamente. Entonces eso es fundamental.

[08:03] También en nuestra condición de filtro, establecer un índice. Si hacemos esto, entonces
va a haber una mejora sustancial en el desempeño de nuestras queries. Entonces esto es lo que
les queríamos dejar como ejemplo principalmente para mejorar entonces el tiempo de nuestras
consultas.

[08:36] Así finalizamos esta parte de nuestro entrenamiento referente a la mejora de desempeño
de MySQL. En nuestra próxima aula estaremos entonces ya hablando sobre gestión de usuarios
y gestión de privilegios. Ya nos vemos.

Retomando la siguiente consulta:


SELECT A.ID, B.ID, A.NOMBRE, B.NOMBRE FROM TABLA A

INNER JOIN TABLA B WHERE A.ID = B.ID

WHERE B.NOMBRE = 'JUAN';COPIA EL CÓDIGO

Considerando que las tablas anteriores sí tienen claves primarias.

¿Cuáles índices debemos construir para mejorar esta consulta?

 Alternativa correta

TABLA A ID
TABLA B ID
TABLA B NOMBRE
¡Alternativa incorrecta! Los campos de ID en ambas tablas, por ser claves primarias, ya tienen sus índices
creados automáticamente.
 Alternativa correta

TABLA A NOMBRE
TABLA B NOMBRE
¡Alternativa incorrecta! Es innecesario crear índices para uno de los campos mencionados en esta opción.
 Alternativa correta

TABLA B NOMBRE
¡Alternativa correcta! Como los campos de ID son claves primarias, entonces únicamente habría que crear
índices para el campo que contiene el criterio de filtro a través de la cláusula WHERE.
Llegó la hora de que sigas todos los pasos realizados por mí durante esta clase. Si ya lo has
hecho ¡Excelente! Si todavía no lo has hecho, es importante que ejecutes lo que fue visto en los
vídeos para que puedas continuar con la próxima aula.

1) En Workbench también podemos consultar el plan de ejecución. Crea un nuevo script SQL,
digita y ejecuta:

SELECT A.CODIGO_DEL_PRODUCTO FROM tabla_de_productos A;COPIA EL CÓDIGO


2) En el área donde aparece el resultado, dirígete hacia el final de las opciones, y
selecciona Execution Plan:

Observarás el plan de ejecución de manera gráfica.

3) Visualicemos consultas más complejas. Primero, digita y ejecuta en el mismo script:

SELECT A.CODIGO_DEL_PRODUCTO, C.CANTIDAD FROM tabla_de_productos A INNER JOIN


items_facturas C ON A.CODIGO_DEL_PRODUCTO = C.CODIGO_DEL_PRODUCTO;COPIA EL CÓDIGO

4) Al visualizar nuevamente el plan de ejecución, aparece así:


5) También, digita y ejecuta:

SELECT A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA) AS ANO,C.CANTIDAD FROM


tabla_de_productos A INNER JOIN items_facturas C ON A.CODIGO_DEL_PRODUCTO =
C.CODIGO_DEL_PRODUCTO INNER JOIN facturas B ON C.NUMERO = B.NUMERO;COPIA EL
CÓDIGO

6) Una vez más, el plan de ejecución es el siguiente:

7) El color rojo indica que no encontró un índice, entonces tuvo que hacer un scan a toda la
tabla; en cambio, el color verde indica que sí encontró un índice, y el mismo, facilitó la
búsqueda al interior de la tabla, reduciendo el costo de procesamiento. En este caso, el índice fue
creado al momento de establecer claves primarias y foráneas en las respectivas tablas.
8) Ahora, vamos a recrear las tablas sin ningún tipo de índice, ni claves primarias, ni claves
externas. También, almacenaremos los registros correspondientes en las nuevas tablas que
crearemos. Digita y ejecuta:

CREATE TABLE `facturas1` (


`DNI` varchar(11) NOT NULL,
`MATRICULA` varchar(5) NOT NULL,
`FECHA_VENTA` date DEFAULT NULL,
`NUMERO` int NOT NULL,
`IMPUESTO` float NOT NULL
);

CREATE TABLE `items_facturas1` (


`NUMERO` int NOT NULL,
`CODIGO_DEL_PRODUCTO` varchar(10) NOT NULL,
`CANTIDAD` int NOT NULL,
`PRECIO` float NOT NULL
);

CREATE TABLE `tabla_de_productos1` (


`CODIGO_DEL_PRODUCTO` varchar(10) NOT NULL,
`NOMBRE_DEL_PRODUCTO` varchar(50) DEFAULT NULL,
`TAMANO` varchar(10) DEFAULT NULL,
`SABOR` varchar(20) DEFAULT NULL,
`ENVASE` varchar(20) DEFAULT NULL,
`PRECIO_DE_LISTA` float NOT NULL
) ;

INSERT INTO facturas1


SELECT * FROM facturas;

INSERT INTO items_facturas1


SELECT * FROM items_facturas;

INSERT INTO tabla_de_productos1


SELECT * FROM tabla_de_productos;COPIA EL CÓDIGO

9) Observemos el plan de ejecución de la query más compleja de las que hemos trabajado hasta
el momento aplicado a las tablas que creamos en el paso anterior. Para ello, digita y ejecuta:

SELECT A.CODIGO_DEL_PRODUCTO, YEAR(B.FECHA_VENTA) AS ANO,C.CANTIDAD FROM


tabla_de_productos1 A INNER JOIN items_facturas1 C ON A.CODIGO_DEL_PRODUCTO =
C.CODIGO_DEL_PRODUCTO INNER JOIN facturas1 B ON C.NUMERO = B.NUMERO;COPIA EL
CÓDIGO

10) El plan de ejecución de workbench muestra lo siguiente:


Todos los rectángulos aparecen en rojo, el costo de procesamiento fue el más alto posible debido
a que las búsquedas se realizaron sin la ayuda de índices.

11) Vamos ahora a trabajar con la herramienta mysqlslap. Esta, simula accesos concurrentes a
una consulta. Desde el símbolo del sistema de Windows, vamos a ejecutar los siguientes
comandos para acceder nuevamente a mysql:
cd\
cd "Program Files"
cd "MySQL"
cd "MySQL Server 8.0"
cd BinCOPIA EL CÓDIGO
12) Al estar dentro del directorio bin/, digita y ejecuta:
mysqlslap -uroot -p --concurrency=100 --iterations=10 --create-schema=jugos_ventas --
query="SELECT * FROM facturas WHERE FECHA_VENTA = '20170101'";COPIA EL CÓDIGO
13) Observarás un output semejante al siguiente:

Este es el promedio de tiempo que van a demorar 100 usuarios diferentes para obtener el
resultado de la misma consulta al ejecutarla al mismo tiempo.

14) Si efectuamos la simulación anterior utilizando como referencia la tabla que creamos sin
claves primarias ni foráneas, notaremos un cambio en los tiempos de procesamiento. Digita y
ejecuta:

mysqlslap -uroot -p --concurrency=100 --iterations=10 --create-schema=jugos_ventas --


query="SELECT * FROM facturas1 WHERE FECHA_VENTA = '20170101'";COPIA EL CÓDIGO
Y el output será, respectivamente:

¿Qué puedes concluir con estos resultados?

Hola, alumnos y alumnas, sean bienvenidos entonces a nuestra aula número 4 en la cual
estaremos hablando sobre gestión de usuarios y especialmente en este primer video hablaremos
sobre la creación de un usuario admin o administrador. Cuando instalamos MySQL, nosotros
creamos un usuario root y establecimos una contraseña, porque este usuario root es necesario
para el primer acceso al servidor, a MySQL.

[00:31] Sin embargo, en la vida real lo que se hace muchas veces es, cuando se instala MySQL,
lógicamente en principio se utiliza el usuario root, pero lo que generalmente se acostumbra a
hacer es tomar y crear un nuevo usuario administrador, con todos los privilegios y eliminar el
usuario root.

[00:53] Porque la contraseña del usuario root la puede tener cualquier persona, el que instaló
MySQL por ejemplo y lo que queremos es que esa contraseña de usuario administrador sea lo
más reservada posible y que únicamente tenga acceso a ella el DBA, que va a ser que va a estar
administrando la base de datos.

[01:21] Entonces lo que haremos es crear inicialmente un administrador, una cuenta de


administrador con todos los privilegios y posteriormente eliminaremos nuestro usuario root.
Para ello vamos a venir aquí, en el área navigator, en la pestaña de la izquierda que dice
administration, clic y donde dice users and privileges, damos clic y nos aparece este asistente.

[01:43] Local instance MySQL users and privileges, entonces tengo los siguientes usuarios, y
entre ellos está el usuario root. Le voy a decir add account, todos estos demás usuarios fueron
creados al momento de la instalación. Add account, vamos a colocarla, admin01, es el nombre
que le daremos, el tipo de autenticación estándar.

[02:10] Limit to host matching, después le voy a explicar, este porcentaje quiere decir cualquier
dirección IP. Este porcentaje, recordemos cuando usábamos el like y usábamos porcentaje,
quiere decir cualquier cosa. No lo vamos a dejar con ese porcentaje sino que le vamos a decir
localhost. Él va a ser localhost y vamos a establecer una contraseña para el usuario admin01.

[00:31] Puede ser la misma, admin01 para nuestro ejercicio. Aquí también, admin01. Dice que
es una contraseña frágil. No importa. Donde dice account limits, es la cantidad de queries que
podemos hacer, actualizaciones, conexiones. Si lo dejamos en 0 es lo que sea, pero si yo me
pongo aquí a cambiar esto, entonces voy a establecer un límite para la cuenta, entonces va a
quedar en 0.

[03:00] Roles administrativos, aquí es donde yo le autorizo por ejemplo al DBA, le puedo decir
que haga todo esto. Entonces puedo venir aquí, clicar todas estas opciones, porque el DBA
puede hacer cualquier modificación en la base de datos: create, alter, delete, drop, execute. Todo
lo que está aquí.

[03:25] En vez de venir y cliquear aquí en todos esos privilegios yo le voy a dar aquí, en esta
opción que dice rol DBA. Cuando le doy rol DBA me selecciona todo. Entonces mi DBA tiene
todos los privilegios. Le vamos a dar apply y dice que el usuario fue creado en localhost. Ya lo
tenemos aquí. Ahora, después de haber creado mi usuario en localhost, yo voy a venir aquí a
home y MySQL connection, voy a crear una nueva conexión.

[03:58] Esa nueva conexión la voy a llamar Local Instance y voy a ponerle admin 01.
Hostname: localhost. Username: admin01 y vamos a darle test connection. Me va a pedir la
contraseña, admin01 y le voy a decir almacenar el password para no estar digitándolo cada vez.
Okay y me dice: successfully made the MySQL connection.

[04:36] Le damos okay y ya tengo mi nueva conexión local con el servidor local a través de la
cuenta admin01. Ahora voy a accesar a esta nueva cuenta. Entonces tengo en estas pestañas en
la parte superior, tengo la local instance y tengo todas las bases de datos con todas las tablas y
todo. Porque estoy accediendo con todos los privilegios y no limité el acceso del usuario admin
a ningún esquema en específico.

[05:03] Estando como admin puedo venir a home, puedo cerrar esta instancia local de root. La
cierro, vengo a home, para poder eliminar la cuenta root tengo que estar logueado como admin
lógicamente. Ahí sí vengo a donde está esta, y vengo a la herramienta. Este botoncito es la
herramienta. Donde dice local instance MySQL 80, la selecciono y le doy delete y le doy close.

[05:38] Hemos eliminado nuestra cuenta root. Únicamente tenemos nuestra conexión con mi
base de datos a través de la cuenta admin. ya la cuenta root no existe más. Sin embargo yo
puedo crear rápidamente, este usuario también a través de líneas de comando.

[06:07] Esto se hace de la siguiente forma. CREATE USER 'admin02' @ aquí especificamos
'localhost' después le decimos IDENTIFIED BY y el nombre del usuario. Él se va a llamar
'admin02'; Entonces rodamos este comando. Hemos creado el usuario. Ahora la segunda línea
de comando es para darle los permisos a este usuario.

[07:02] Entonces sería GRANT ALL PRIVILEGES ON (asterisco sería todas las bases de
datos).(todas las tablas) TO 'admin02' @ 'localhost' WITH GRANT OPTIONS. De esa manera
yo le estoy dando todos los privilegios al usuario admin02. Ejecutemos el comando.

[07:51] Al ejecutarlos, si venimos nuevamente a administration y venimos a users and


privileges, ya me va a aparecer mi usuario admin02. Si le doy clic, vengo al límite de la cuenta,
todo igual y los roles están todos seleccionados. Esta es la forma como nosotros podemos crear
una cuenta de administrador tanto por Workbench, a través de estos asistentes o a través de
líneas de comando en el script.

[08:25] Nos vemos en el próximo video para ver cómo creamos un usuario normal, un usuario
común que pueda acceder a los datos, pero que no tenga tantos privilegios como el DBA. Ya nos
vemos.

¿Por qué es aconsejable excluir el usuario root?


 Alternativa correta

Porque este usuario es creado durante la instalación y su contraseña es definida en ese momento, por
el operador que realizó la instalación.
¡Alternativa correcta! El usuario root es creado durante la instalación y su contraseña es definida por un operador
que hizo la instalación. Pero, no siempre, está persona será el DBA. Cambiar la contraseña del
usuario root también resuelve el problema de seguridad, pero lo aconsejable es crear un nuevo usuario
administrador y excluir el root.
 Alternativa correta

Porque el usuario root es temporal y será excluído del ambiente.


 Alternativa correta

Porque el usuario root no tiene privilegios y es creado tan solo durante la instalación, para el primer
acceso.
¡Alternativa incorrecta! El usuario root cuenta con todos los privilegios de administrador del ambiente.

Los saludo una vez más a todos. Gran parte, los usuarios que van a acceder a la base de datos
son usuarios con una serie de privilegios comunes a todos, que nos son todos los privilegios de
DBA. Este usuario común tampoco necesita tener todos los privilegios.

[00:18] Yo les mencionaba en los cursos anteriores que por ejemplo el comando DROP era muy
delicado, muy peligroso, entonces si se le daba a un usuario común este permiso, puede ser que
él cometa un error y acabe eliminando información muy importante de la base de datos o
borrando una base de datos.

[00:37] Entonces este tipo de problemas se pueden presentar y por eso es necesario que al crear
un usuario común seamos muy cuidadosos con cuáles permisos o cuáles privilegios les vamos a
dar. Entonces para crear una usuario común, vamos a crear un nuevo script.

[00:54] Hay dos formas de hacerlo. También a través del asistente de Workbench o en línea de
comando. Vamos a comenzar con el asistente, user and privileges, damos clic. Le damos aquí
donde dice add account,. Vamos a llamarlo user01, lo vamos a llamar solo así. La conexión
localhost, también va a tener acceso a través de la conexión local solamente. El password va a
ser user01 y también lo repetimos, user01.
[01:28] Los límites de la cuenta los dejamos igual, los roles, entonces damos clic aquí a DBA.
Entonces ya estamos quitando todos los privilegios y él va a tener solamente los siguientes
privilegios. Él va a tener la posibilidad de hacer SELECT, UPDATE, también va a poder hacer
INSERT y va a poder hacer DELETE, que son como las funciones principales: SELECT,
UPDATE, INSERT, DELETE.

[01:59] También va a tener la posibilidad de hacer EXECUTE, que es por ejemplo cuando hay
un stored procedure y entonces necesita ejecutarlo porque va a hacer ciertas operaciones con las
tablas, entonces es bueno que tenga la opción de ejecutar stored procedure. No los puede crear
como tal pero sí los puede ejecutar.

[02:21] También va a tener lock tables. A veces hay transacciones que requieren que la tabla
esté bloqueada por un instante en cuanto este usuario lo hace y después la desbloquea. Entonces
es bueno que tenga lock tables y también create temporary tables.

[02:36] ¿Por qué? Porque de la misma manera, al crear una tabla temporaria el usuario puede
hacer diversas operaciones, pero esta tabla posteriormente cuando se acabe la sesión, ya se
elimina. Utiliza únicamente los recursos de RAM disponibles para esta tabla. Entonces
básicamente estos son los privilegios que le damos al usuario user01.

[02:56] Le damos apply y, si venimos aquí, ya aparece user01. A través de líneas de comando,
yo simplemente voy a copiar estos dos comandos que utilizamos anteriormente. Los vamos a
pegar aquí, en nuestro nuevo script. Aquí simplemente lo vamos a cambiar y le vamos a decir
que este se llama user02 y también la contraseña va a ser user02.

[03:22] Ese IDENTIFY BY es la contraseña que le da acceso a ese usuario. Aquí quitamos
GRANT ALL PRIVILEGES y aquí es donde decimos todos los privilegios que va a tener:
SELECT, INSERT, UPDATE, DELETE. También va a tener el privilegio de CREATE
TEMPORARY TABLES. Va a tener el privilegio de LOCK TABLES.

[03:59] Y por último, también va a tener el privilegio de EXECUTE en caso de funciones o de


stored procedures también. ¿A cuál usuario? A user02. Este WITH GRANT OPTION no, lo
quitamos porque ese es el que daba todas las opciones GRANT. Entonces simplemente
ejecutamos este primer comando y ejecutamos este segundo comando.

[04:24] Y de esa forma, si venimos aquí, cerremos esta parte porque no nos va a aparecer
aunque le demos refresh, no aparece. Cerramos. Le damos cerrar. Si venimos a users and
privileges de nuevo ya nos aparece el user02 con sus respectivas roles que creamos. Hasta aquí
los privilegios de esquema los vamos a ver posteriormente.

[04:53] Entonces, esta es la manera como nosotros creamos un usuario con tanto por líneas de
comando aquí en el script o a través de Workbench usando este asistente. Ya nos vemos.

Cuáles son los privilegios del usuario normal?


 Alternativa correta

SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE


¡Alternativa incorrecta! Hace falta una propiedad en la lista.
 Alternativa correta

SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE, RELOAD


¡Alternativa incorrecta! Uno de los privilegios mencionados no es aconsejable para el usuario normal.
 Alternativa correta

SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE
¡Alternativa correcta! Estos son los privilegios que se deben asignar a un usuario normal para que pueda trabajar
en la base de datos.

También existe un tipo de usuario que podemos crear, que es únicamente para hacer lecturas en
las tablas. Por ejemplo un usuario que solo puede realizar informes, digamos una analista de
business intelligence, que solo tiene que realizar informes y no necesita estar haciendo ningún
tipo de INSERT o UPDATE o DELETE en las tablas.

[00:19] Es solo tomar la información y posiblemente también ejecutar algún stored procedures
para en su informe poder, a través de estos datos, generar información valiosa para la toma de
decisiones, por ejemplo. A él no le corresponde la toma de decisiones, pero sí generar el informe
para que el área encargada de esta parte tenga todos los datos que necesita para actuar en su
negocio.

[00:48] ¿Cómo creamos este usuario? Hay las mismas dos maneras. Vamos a crearlo
únicamente aquí a través de líneas de comando. Ustedes pues ya vieron, es básicamente la
misma sintaxis. Vamos a copiarlas del script anterior y la vamos a pegar y vamos a llamarlo
read01. También vamos a decirle read01, entonces quedó grabado así nuestro usuario.

[01:17] Como 'read01'. Únicamente le vamos a dejar GRANT SELECT y la opción de


EXECUTE, 'read01'. Este usuario únicamente puede leer las tablas y también ejecutar stored
procedures, más nada. Eso es lo único que puede hacer este usuario.

[01:46] Entonces lo ejecutamos aquí y también ejecutamos estos permisos, estos privilegios que
va a tener. Y si venimos nuevamente a users and privileges, venimos al usuario read, va a
aparecer aquí rápidamente, en los roles CUSTOME, EXECUTE y SELECT. Mas nada.

[02:11] Entonces básicamente así es como nosotros podemos crear un usuario de solo lectura.
Este usuario no puede hacer ninguna alteración en la tabla.

[02:22] La cuestión aquí con este usuario, debemos saber que al él tener la posibilidad de hacer
un EXECUTE, entonces si el stored procedure, de repente tiene algunos procedimientos de
INSERTs o algunos DELETEs en el stored procedure como tal y si este usuario, que es solo
lectura, ejecuta ese stored procedure, él también eventualmente va a estar insertando
información.

[02:47] Hay que tomar cuidado y en caso de algún error en ese sentido, no es culpa de este
usuario que tiene acceso a solo lectura, sino el DBA no fue lo suficientemente cuidadoso de, a la
hora de crear su stored procedure, él no haber puesto este tipo de comandos al interior del stored
procedure.

[03:05] Pero estas son cosas que se observan, se analizan y que es importante dejarlas claras
para que no se vayan a cometer errores a la hora de autorizar ciertos privilegios a determinados
usuarios.

[03:25] Entonces, para que quede digamos como esta parte un poco clara. Nos vemos en el
próximo video para ver cómo se crea un usuario para realizar únicamente backup. Hay veces
que se necesita un usuario que haga los backups solamente, entonces eso lo estaremos
mostrando cómo se hace. Ya nos vemos.

Al habilitar los privilegios de READ y EXECUTE al usuario de lectura, ¿Qué sucede cuando
este ejecuta un Stored Procedure que realiza mantenimiento en las tablas?
 Alternativa correta

La ejecución de Stored Procedures con READ y EXECUTE no es permitida.


¡Alternativa incorrecta! Una de estas propiedades permite la ejecución de Stored Procedures.
 Alternativa correta

El Stored Procedure va a retornar un error, ya que no es posible hacer mantenimiento en la de


datos, dado que el usuario no tiene los privilegios de INSERT, UPDATE y DELETE.
¡Alternativa incorrecta! No se presentarán errores cuando el usuario ejecute Stored Procedures.
 Alternativa correta

El Stored Procedure será ejecutado normalmente, aunque el usuario tenga solamente la


propiedad READ para las tablas.
¡Alternativa correcta! Esta es una característica peligrosa, porque a pesar de que el usuario no tenga los
privilegios de INSERT, UPDATE y DELETE, los comandos que realizan estas ejecuciones en la tabla, que se
encuentran al interior del Stored Procedure, serán ejecutados, porque la característica EXECUTE se sobrepone a
los mismos.

Generalmente en las empresas siempre también, de repente se deja usuario encargado de hacer
los back-ups. Entonces ese usuario es únicamente para hacer los back-ups, o sea las copias de
seguridad de la base, con una cierta regularidad. Entonces para eso se crea un usuario de back-
up.

[00:17] Vamos a crear un nuevo script y el usuario de back-up tiene unos privilegios particulares
que son principalmente para hacer el back-up. Vamos a crearlo primero por líneas de comando
con una contraseña también. Va a llamarse back01 y le vamos a autorizar los siguientes
privilegios.

[00:43] Va a ser SELECT, RELOAD, el comando RELOAD lo que hace es refrescar los
privilegios. LOCK TABLES, lógicamente si va a ser un back-up, dependiendo si lo va a ser sin
usar el MySQLDUMP tiene que hacer un LOCK TABLES y REPLICATON CLIENT. Que se
replique.
[01:12] ¿A cuál usuario? Al usuario 'back01', 'localhost'. Entonces ejecutemos y creemos a este
usuario. Ya tenemos un usuario que hace únicamente los back-ups. Lo podemos crear también
aquí a través de users y privileges, lo mismo. Le damos add account, él se va a llamar back02, el
acceso va a ser a través de localhost, el password va a ser back02, y también aquí confirmamos
ese password, back02.

[01:48] Yo estoy poniendo esas contraseñas sencillas, porque lógicamente si queremos eliminar
todos los privilegios que hay aquí le damos aquí a DBA dos veces y ya queda asignada. Estamos
creando contraseñas sencillas porque finalmente estamos haciendo un pequeño ejercicio, pero
las contraseñas cada persona o el administrador da unas contraseñas usando parámetros
especiales para asignar ciertas contraseñas a sus usuarios.

[02:17] Entonces venimos acá y las opciones que él tiene son la opción de LOCK TABLES,
RELOAD, REPLICATION CLIENT y SELECT. Son únicamente esas custro opciones de este
usuario para back-up. Le damos apply y ya aparece aquí nuestro usuario de back-up.

[02:39] Entonces básicamente así concluiríamos a la parte de creación de usuarios y gestión de


privilegios para estos usuarios a través aquí tanto de MySQL, Workbench como a través de las
líneas de comando del script.

[02:59] En nuestra próxima aula estaremos viendo cómo gestionar de forma más específica
nuestras conexiones y también el acceso a las diferentes bases de datos a los usuarios. Ya nos
vemos.

¿Cuáles son los privilegios para que el usuario pueda realizar los backups?
 Alternativa correta

SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT


¡Alternativa correcta! Estas son las propiedades necesarias para que un usuario con privilegios de backup, pueda
ejecutar el mismo en la base de datos.
 Alternativa correta

SELECT, RELOAD, EXECUTE, REPLICATION CLIENT


¡Alternativa incorrecta! Una de estas propiedades no es aconsejable para el usuario que hace los backups.
 Alternativa correta

SELECT, RELOAD, LOCK TABLES, EXECUTE


¡Alternativa incorrecta! Una de estas propiedades no es aconsejable para el usuario que hace los backups.

Llegó la hora de que sigas todos los pasos realizados por mí durante esta clase. Si ya lo has
hecho ¡Excelente! Si todavía no lo has hecho, es importante que ejecutes lo que fue visto en los
vídeos para que puedas continuar con la próxima aula.
1) Cuando instalaste MySQL, fue creado un usuario root, con privilegios de administrador. Sin
embargo, normalmente, este usuario se elimina y se sustituye por un administrador real.
2) En Workbench, en el área Navigator haz clic en la pestaña Administration:
3) Haz clic en Users and Privileges:

4) Encontrarás una nueva ventana, y, en el lado izquierdo de la misma, tendrás la lista de


usuarios de ambiente. Allí se encuentra el usuario root.
5) Haz clic sobre el botón Add Account:

6) En la caja de diálogo, en la pestaña Login, rellena los campos Login Name, Limit to Hosts
Matching, Password y confirma la contraseña como se muestra a continuación (Para mayor
practicidad, puedes usar como contraseña el mismo nombre de usuario):
7) En la pestaña Administrative Roles, escoge los privilegios que este usuario tendrá en
MySQL. Selecciona DBA; así, todos los privilegios serán otorgados:

8) Haz clic en Apply. De esta manera, el usuario será creado.

9) Podemos ahora cerrar la pestaña de la conexión actual en Workbench.

10) En la pantalla de conexiones, crea una nueva conexión (haciendo clic sobre el botón +), con
el usuario creado en los pasos anteriores:
11) Haz clic en Test Connection y guarda la conexión.
12) Accede a Workbench con el usuario admin01.
13) De igual manera, podemos crear usuarios a través de líneas de comando en SQL. Para crear
otro usuario administrador (que llamaremos admin02). Digita y ejecuta:
CREATE USER 'admin02'@'localhost' IDENTIFIED BY 'admin02';
GRANT ALL PRIVILEGES ON *.* TO 'admin02'@'localhost' WITH GRANT OPTION;COPIA EL
CÓDIGO
14) Para eliminar el usuario root, desde un script en la conexión Local Instance admin01 digita
y ejecuta:
DROP USER 'root'@'localhost';COPIA EL CÓDIGO
15) Si intentas conectarte al servidor a través del usuario root no será posible porque este
usuario ya no existe.

16) Lo que determina lo que un usuario podrá hacer o no, son sus parámetros, tanto en la caja de
diálogo de Workbench como a través de comandos SQL.

17) Ahora, crearemos un usuario llamado user01, usando la pestaña Administration y la


opción Users and Privileges. Este usuario tendrá los siguientes privilegios: CREATE
TEMPORARY TABLES, DELETE, EXECUTE, INSERT, LOCK TABLES, SELECT y
UPDATE:
18) haz clic en Apply.

19) Crea otro usuario normal, pero en esta ocasión será via comandos SQL. Digita y ejecuta:

CREATE USER 'user02'@'localhost' IDENTIFIED BY 'user02';


GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE ON *.* TO 'user02'@'localhost';COPIA EL CÓDIGO
20) Adicionalmente, crea un usuario solamente para lectura, con login read01, a través de la
caja de diálogo y otro, read02, via SQL. Para estos usuarios, los privilegios serán SELECT y
EXECUTE. Los comandos que emplearás son los siguientes:
CREATE USER 'read02'@'localhost' identified BY 'read02';
GRANT SELECT, EXECUTE ON *.* TO 'read02'@'localhost';COPIA EL CÓDIGO
21) Finalmente, crea dos usuarios más para hacer copias de seguridad, con los
logins back01 y back02. Aquí, estos usuarios solamente pueden hacer backups:
CREATE USER 'back02'@'localhost' IDENTIFIED BY 'back02';
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT ON
*.* TO 'back02'@'localhost'

Hola a todos y a todas, vamos a continuar aquí estudiando. Todos los usuarios que hemos creado
hasta el momento solo pueden acceder a la base de datos a través de localhost, cuando el cliente
es localhost, entonces la máquina directamente, que es donde está el servidor.

[00:16] Pero realmente nadie va a hasta el servidor y hace todo su trabajo desde el servidor, sino
que son las máquinas, diferentes equipos en la red de la empresa que se conectan al servidor, por
ejemplo. ¿Qué sucede?

[00:31] Nosotros aquí donde esta este localhost, podemos modificarlos y colocar la dirección de
IP o tambien podemos colocar, indicar que se puede acceder de cualquier lugar. Le vamos a
mostrar cómo se crea un usuario genérico. Entonces vamos a venir aquí en nuestra área de
esquemas, donde dice administration, vamos a ir a Users and Privileges y aquí vamos a darle
Add Account.

[01:00] Al darle a Add Account, entonces vamos a copiar que el usuario es un administrador
también genérico o admingeneric01. Voy a darle un zoom, y aquí donde está este percent o este
% el signo de percent, ¿qué sucede? Esto es un signo que determina cualquier cosa.

[01:30] Ustedes recuerdan cuando estábamos trabajando con el comando like en el curso de
consultas avanzadas, siempre que colocábamos este percent era cualquier cosa antes o después.
Entonces aquí este percent, cuando se deja así, cualquier IP. Entonces aquí vamos a dejarlo así,
sin cambiarlo, vamos a darle admingeneric y también en nuestra contraseña la vamos a dejar
igual: admingeneric01.

[01:58] Después de hacer ello, venimos aquí a donde dicen los roles, como va a ser
administrador, entonces vamos a darle seleccionar a donde dice aquí DBA. De esa forma está
listo nuestro usuario. Le damos apply y ya aparece nuestro admingeneric y con la diferencia de
que tiene, en vez de decir localhost, tiene porcentaje.

[02:25] ¿Esto que quiere decir? Que mi usuario administrador se puede conectar desde cualquier
dirección de IP desde la que se encuentre. Lo importante es que él accese con sus credenciales.
Esa es una forma de crear este usuario admin. Otra forma de hacerlo es directamente desde
líneas de comando.

[02:50] Para ello vamos a utilizar el mismo script que usamos cuando creamos un usuario
administrador. Vamos a venir al script, seleccionamos, venimos a nuestro nuevo script y en vez
de 'admin02' así, vamos a llamarlo 'admingeneric02'. Aquí colocamos la contraseña generic y
todos los privilegios a todas las bases de datos, todas las tablas a 'admingeneric02' y no
'localhost'.

[03:25] Aquí vamos a sustituir el 'localhost' por '%', lo mismo acá. De esa manera este usuario se
puede conectar desde cualquier dirección de IP. Ejecutamos estos dos comandos y ya tenemos
nuestro usuario admin. Si cerramos acá y volvemos y abrimos, venimos aquí a users and
privileges, ya está nuestro admingeneric, que también se conecta de cualquier dirección IP.

[04:00] Yo tengo aquí una pequeña presentación de cómo se puede usar este comando o este %.
Si yo pongo un rango de IP, supongamos que al interior de mi organización, en mi red interna de
la organización, la red privada, yo establecí este rango de IP 192.168.1.% quiere decir que yo
voy a poder acceder con ese usuario desde la IP 192.168.1.0 hasta la 192.168.1.255.

[04:36] Entonces este porcentaje sustituye todas estas posibles IP. Aquí si yo por ejemplo
tuviera 192.168.% entonces podría acceder desde un rango de IPs más grande. Ahora bien, si yo
sustituyo ese porcentaje, por ejemplo pusiera 192.168.1.1_ y dos underscore o guiones bajos,
entonces aquí en ese underscore irían números. Nuevamente el rango podría cambiar.

[05:13] El administrador podría accesar técnicamente desde cualquier computador dentro de la


organización por ejemplo. O si se tiene un dominio lo mismo. Si queremos acceder al dominio,
entonces client __.mycompany.com, entonces aquí es el ejemplo, aquí ya podrían ser números o
letras o cualquier cliente.
[05:36] Entonces de esa manera se puede también acceder directamente a través del dominio.
Entonces esto era lo que queríamos mostrarles sobre la forma de crear un administrador
genérico con acceso con el privilegio de conexión desde cualquier lugar. En el próximo video
estaremos hablando sobre dar privilegio de acceso a ciertos esquemas o a ciertas tablas. Ya nos
vemos.

Cuál será el intervalo de direcciones IP si configuramos, con los comandos de privilegio de


usuario, el valor 192.168.%?
 Alternativa correta

192.168.100.0 a 192.168.255.255.
¡Alternativa incorrecta! El intervalo no corresponde a la opción presentada en el enunciado.
 Alternativa correta

192.168.0.0 a 192.168.255.255.
¡Alternativa correcta! Este es el grupo de direcciones IP que compone el intervalo presentado.
 Alternativa correta

192.168.0.0 a 192.168.0.255.

Ya vimos que podemos crear usuarios con ciertos privilegios de acceso, pero no siempre los
usuarios van a tener que acceder a todas las bases de datos. Aquí por ejemplo yo tengo varias
bases de datos y únicamente quiero que el usuario pueda ver esta base que dice jugos_ventas.

[00:22] ¿Cómo lo hacemos? Lo podemos hacer de dos maneras. Vamos a mostrarlo a través de
Workbench, a través del asistente y de líneas de comando. Venimos a Users and Privileges, Add
Account, vamos a llamarlo user03. Vamos a dejar aquí el % para que se conecte de cualquier
lugar, contraseña user03. Confirmamos la contraseña, sería user03 también y donde dice los
roles administrativos, presionamos dos veces para dejar todo esto en limpio.

[00:55] Entonces él como usuario común, él puede hacer UPDATE, puede hacer SELECT,
puede hacer INSERT, puede hacer LOCK TABLES, puede hacer también EXECUTE, él puede
hacer DELETE y CREATE TEMPORARY TABLES. Entonces, DELETE, EXECUTE,
INSERT, LOCK TABLES y nos falta UPDATE.

[01.23] Estos son los privilegios. Perfecto. Pero ahora vamos a entrar donde dice aquí Schema
Privileges. Aquí le damos donde dice Add Entry. En Add Entry vamos a seleccionar un schema
y la base que vamos a seleccionar es jugos_ventas. Le damos okay, y aquí en este lugar nos
muestra, en esta ventana todo eso que puede hacer. Incluso podemos colocar privilegios
adicionales.
[01:50] Podemos inclusive presionar aquí para revocar todos los privilegios, pero no vamos a
dejar esto aquí por defecto. Si seleccionamos aquí el esquema, yo podría aquí y venir a
especificar ciertas cosas que él puede hacer pero no, lo vamos a dejar así por defecto. Le damos
apply y listo. Ya creamos nuestro usuario03.

[02:10] Yo también puedo crear este usuario, veamos aquí, salgamos de esta área. Creemos un
nuevo script y el comando para crear el usuario es lo mismo. Entonces, CREATE USER,
entonces este usuario se va a llamar 'user 04' @ entonces el se puede conectar desde cualquier
lugar, '%'. La contraseña IDENTIFIED BY.

[02:51] También sigue siendo 'user04'; que sería la contraseña. Ahora demos los privilegios
GRANT. ¿Cuáles privilegios tiene? SELECT, INSERT, UPDATE, DELETE, CREATE
TEMPORARY TABLES.

[03:20] También tiene el privilegio de LOCK TABLES y finalmente tiene el privilegio de


SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, LOCK TABLES,
y también tiene el privilegio de EXECUTE, lógicamente porque él tiene la posibilidad de
ejecutar alguna stored procedure.

[03:46] Entonces EXECUTE ON y normalmente colocaríamos .. Este primer asterisco quiere


decir en la base de datos y este segundo asterisco es la tabla. Entonces nosotros cuando lo
dejamos así, sería cualquier base de datos y cualquier tabla, pero no, queremos que él
únicamente entre a jugos_ventas, que es la base de datos que hemos venido trabajando.

[04:20] Aquí le decimos TO al usuario, que seria este 'user04' desde localhost. Entonces hemos
creado este usuario con todos estos privilegios de usuario común, lo ejecutamos. Ya tiene todos
los accesos pero yo también puedo limitar el acceso de este usuario, vamos a crear un nuevo
usuario llamado 05. Vamos a ver aquí.

[04:53] Y a este usuario le vamos a dar otros privilegios, únicamente pero de acceso a la tabla.
Entonces, cuando vamos a dar acceso únicamente a la tabla, ya únicamente él puede hacer
SELECT, INSERT, UPDATE, DELETE. no puede hacer mas nada. ON jugos_ventas y una
tabla, podría ser por ejemplo facturas y el 'user05'.

[05:22] Entonces vamos a crear este usuario 05, y le vamos a dar únicamente esos privilegios
aquí de la tabla. Finalmente vamos a crear aún otro privilegio para este usuario, vamos a
seleccionar esta última línea, un privilegio exclusivo de lectura para otra tabla.

[05:47] Entonces en vez de INSERT, UPDATE, DELETE vamos a darle privilegio a la


tabla_de_vendedores al 'user05'. Entonces GRANT SELECT ON
jugos_ventas.tabla_de_vendedores. Lo ejecutamos. ¿Qué hicimos?

[06:11] Creamos un usuario 4 que tiene acceso a toda la base de datos jugos_ventas. Venimos
aquí, vamos a crear una conexión, entonces vamos a decir local, vamos a llamarla local user04.
El localhost y el user name sería user04, default. Vamos a ver test connection, user04, le damos
password, la conexión está bien. Damos Okay. Vamos a acceder ahora a la base de datos a
través de user04.
[06:52] Y si accedemos, noten ustedes en el área de esquemas, solo tengo acceso a jugos_ventas
pero tengo acceso a todas mis tablas. Y puedo hacer cualquier opción. SELECT * FROM
FACTURAS; Si la ejecuto me va a mostrar todo lo que hay en facturas sin ningún
inconveniente. Volvamos aquí a home, a nuestra casita y vamos a crear otra conexión.

[07:19] Ella se va a llamar local user05. Hostname localhost, el usuario es user05. Test
connection, colocamos el password que sería user05 también. Le damos a almacenar, okay,
conexión perfecto, todo okay. Ahora vamos a acceder desde user05 a la base de datos. Si
venimos al área de esquemas, únicamente me van a aparecer las tablas de facturas y la tabla de
vendedores.

[07:51] Pero si yo por ejemplo en la tabla de vendedores, volvamos aquí, a nuestro


administrador, a la tabla de vendedores le dimos únicamente SELECT, le otorgamos únicamente
la opción de SELECT entonces yo no puedo hacer ninguna otra operación en la tabla de
vendedores.

[08:10] Vamos a verlo aquí, volvamos a la conexión user05, vamos a darle clic derecho a la
tabla de vendedores y vamos a darle Send to SQL Editor un insert statement. Vamos a insertar
en la tabla de vendedores esta información. MATRÍCULA, pongamos cualquier matrícula aquí.

[08:37] Matrícula puede ser, matrícula es VARCHAR, entonces '256'. Nombre también es
VARCHER, entonces sería cualquier cosa, digamos 'José García'. El porcentaje de comisión es
un FLOAT, entonces digamos que el porcentaje es el 0.15.

[09:01] Fecha de admisión es un DATE, entonces la admisión fue el día del ‘20190303’.
Vacaciones es un BIT, entonces si estas vacaciones o no le vamos a decir 0, que no, y el barrio
donde trabaja, digamos que el barrio es 'Oblatos', entre comillas. Perfecto.

[09:34] Vamos a ejecutar este código a ver si podemos hacer un INSERT en la tabla de
vendedores. Entonces nos aparece un error. Entonces le voy a mostrar aquí cuál es el error y el
error es el siguiente. Error Code: 1142 command denied to 'user05'.

[09:59] Entonces este comando INSERT está negado porque en los privilegios que le dimos al
usuario 05, ven que únicamente tiene el privilegio SELECT. Entonces básicamente esta es la
forma como podemos dar privilegio de acceso a ciertos esquemas y a ciertas tablas a nuestros
diversos usuarios. Nos vemos en el próximo video para mostrarles cómo podemos revocar
también estos privilegios.

Hola, alumnos y alumnas. Ya vimos entonces cómo dar toda serie de privilegios a los usuarios,
acceso a ciertos esquemas, acceder desde cualquier servidor, vimos cómo crear diversos
usuarios. Ahora vamos a ver cómo podemos revocar esos privilegios. Hay dos formas de hacerlo
también, a través del asistente aquí de Workbench o de líneas de comando.

[00:22] Vamos a hacerlo a través del asistente, es muy sencillo. Venimos a users and privileges
y vamos a tomar por ejemplo el admin02. Lo seleccionamos, venimos a donde dice schema
privileges, le podemos dar revoke all privileges from the account. Please confirm the revocation.
Le damos revoke. Listo.

[00:48] Entonces si volvemos aquí a los roles administrativos que él tiene, ya no tiene ningún
otro rol. Esta es una forma de hacerlo. Entonces ya mi cuenta admin02 ya no tiene ningún
privilegio.

[01:01] Ahora bien, si yo quiero venir aquí a, cerremos este, al script y queremos quitarle
privilegios al user02, entonces pues yo también puedo, antes de hacerlo, ver cuáles privilegios
tienen mis usuarios en este momento. Entonces venimos aquí y le decimos SELECT * FROM
mysql.user; entonces ejecutamos y nos muestra los diferentes usuarios y sus privilegios.

[01:40] Entonces tenemos nuestros usuarios por ejemplo los genéricos que creamos hace poco y
tenemos los usuarios admin. Tenemos el admin01 y el admin02, como ustedes recuerdan, le
acabamos de quitar todos los privilegios, no tiene ninguno. Entonces hay una forma también de
verlo aquí, a través de otro comando que sería, por ejemplo si yo quiero ver un usuario en
especifico, sería SHOW GRANTS FOR entonces aquí coloco el nombre: 'user02' @ 'localhost’;

[02:28] Entonces él me va a mostrar todo lo que este usuario tiene de permisos. Aquí está:
SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, LOCK TABLES,
EXECUTE en cualquier tabla, en cualquier base de datos.

[02:48] Entonces, para yo quitarle privilegios al usuario 02 lo que yo tengo que hacer es
REVOKE ALL PRIVILEGES FROM el usuario, y aquí también GRANT OPTION FROM
‘user02’. Entonces aquí ejecutamos y hemos quitado todos los privilegios y si yo le doy
nuevamente SHOW GRANTS, entonces me va a aparecer que no tiene ningún privilegio.

[03:25] Entonces nuevamente yo podría venir aquí y le digo GRANT SELECT UPDATE, como
ya hemos venido aprendiendo. Entonces esta es la forma de yo revocar privilegios tanto por el
asistente como a través de las líneas aquí de comando del script. En el próximo video entonces
ya estaremos concluyendo con nuestro entrenamiento. Ya nos vemos.

Llegó la hora de que sigas todos los pasos realizados por mí durante esta clase. Si ya lo has
hecho ¡Excelente! Si todavía no lo has hecho, es importante que ejecutes lo que fue visto en los
vídeos para que puedas continuar con la próxima aula.
1) Todos los usuarios creados hasta el momento pueden acceder a la base de datos a través de la
máquina localhost.
Cuando creas un usuario,si mantienes el símbolo % o __ en el campo Limit to Hosts Matching,
quedará determinado que otros IPs puedan ser utilizados para acceder a la base. Estos caracteres
funcionan como comodines:
CREATE USER 'admingeneric02'@'%' IDENTIFIED BY 'admingeneric02';
GRANT ALL PRIVILEGES ON *.* TO 'admingeneric02'@'%' WITH GRANT OPTION;COPIA EL
CÓDIGO
2) Además, puedes limitar el acceso a las bases y tablas. Crea el usuario user03, pero, en vez de
adicionar privilegios globales en la pestaña Administrative Roles, entra a la pestaña Schema
Privileges y adiciona el esquema al cual podrá acceder, y selecciona privilegios de usuario
normal:
3) A continuación, crea un usuario user04 mediante el script de SQL y adiciona los privilegios
de acceso únicamente en la base jugos_ventas:
CREATE USER 'user04'@'%' IDENTIFIED BY 'user04';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE ON jugos_ventas.* TO 'user04'@'%';COPIA EL CÓDIGO
El usuario recién creado solamente puede visualizar la base jugos_ventas.
4) Crea una nueva conexión para el usuario user04:
5) Accede a la base mediante la conexión creada en el paso anterior y nota que solamente la base
jugos_ventas está disponible para acceso:

6) También, puedes limitar el acceso a las tablas, estableciendo permisos sobre las operaciones
que se pueden realizar sobre ellas:

CREATE USER 'user05'@'%' IDENTIFIED BY 'user05';

GRANT SELECT, INSERT, UPDATE, DELETE ON jugos_ventas.facturas TO 'user05'@'%';

GRANT SELECT ON jugos_ventas.tabla_de_vendedores TO 'user05'@'%';COPIA EL CÓDIGO


Los comandos anteriores le otorgan privilegios al usuario user05 para insertar, actualizar,
excluir y consultar la tabla de facturas, pero solamente le permite el privilegio de lectura a la
tabla tabla_de_vendedores.
7) Crea una conexión para el usuario user05 llamada local user05 y entra a Workbench
mediante esta conexión.
8) En la conexión local user05 Ejecuta el comando:
INSERT INTO `jugos_ventas`.`tabla_de_vendedores`
(`MATRICULA`,
`NOMBRE`,
`PORCENTAJE_COMISION`,
`FECHA_ADMISION`,
`VACACIONES`,
`BARRIO`)
VALUES
('256',
'Jose García',
0.15,
'20190303',
0,
'Oblatos');COPIA EL CÓDIGO
El output será el siguiente error:

9) Existe un comando para verificar los usuarios existentes:

SELECT * FROM mysql.user;COPIA EL CÓDIGO

10) Adicionalmente, hay otro comando que muestra los accesos de un usuario, por ejemplo:

SHOW GRANTS FOR 'user02'@'localhost';COPIA EL CÓDIGO


11) Finalmente, el comando REVOKE ALL retira los privilegios de acceso del usuario
especificado:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user02'@'loca

También podría gustarte