Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
[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.
[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.
1)
SELECT * FROM TABLA1 INNER JOIN TABLA2 ON TABLA1.ID = TABLA2.ID INNER JOIN TABLA3 ON
TABLA2.ID = TABLA3.ID
2)
SELECT * FROM TABLA1 INNER JOIN TABLA2 ON TABLA1.ID = TABLA2.ID INNER JOIN TABLA3 ON
3)
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.
[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.
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.
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:
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):
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?
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.
[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.
[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 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: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
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.
[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: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.
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.
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):
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
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:
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.
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
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.
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:
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:
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:
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:
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: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.
[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.
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 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.
[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.
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: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
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: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
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:
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:
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.
19) Crea otro usuario normal, pero en esta ocasión será via comandos SQL. Digita y ejecuta:
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.
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.
[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.
[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.
[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:
10) Adicionalmente, hay otro comando que muestra los accesos de un usuario, por ejemplo: