SlideShare una empresa de Scribd logo
1 de 23
Descargar para leer sin conexión
Índices en MySQL
— @fedesilva, Tech Meetup 2012
“Todo programador debe ser un
sysadmin competente."
Optimización
Asignar los índices correctos es la forma mas
eficiente de optimizar
• 10% del trabajo
• 90% de los resultados
Índices
• MSSQL puede auto asignar los índices de
acuerdo a estadísticas de uso
• MySQL
• Usualmente manual
• De acuerdo a los casos de uso
Regla rápida
• Columnas usadas en la cláusula WHERE
• Columnas con las que se hacen JOINs
Regla rápida
> select SQL_NO_CACHE count(*) from posts join users on users.Id = posts.OwnerUserId where users.age > 30;	
+----------+	
| count(*) |	
+----------+	
| 27887 |	
+----------+	
1 row in set (0.20 sec)	
!
> alter table posts add index owner (OwnerUserId);	
!
> select SQL_NO_CACHE count(*) from posts join users on users.Id = posts.OwnerUserId where users.age > 30;	
+----------+	
| count(*) |	
+----------+	
| 27887 |	
+----------+	
1 row in set (0.11 sec)	
!
> alter table users add index age (Age);	
!
> select SQL_NO_CACHE count(*) from posts join users on users.Id = posts.OwnerUserId where users.age > 30;	
+----------+	
| count(*) |	
+----------+	
| 27887 |	
+----------+	
1 row in set (0.06 sec)
PRIMARY KEY
• Única
• InnoDB: Los datos se ordenan en el disco de
acuerdo a su clave primaria
• Si no hay una clave obvia, conviene agregar una
columna arbitraria, auto_increment (90% de los
casos)
UNIQUE KEY
• Mismas optimizaciones que la clave primaria
• Tamaño promedio del grupo de valor 1
FOREIGN KEY
• Usamos la clave desde otra tabla
• Restricciones de negocio
• :)
Columnas múltiples
• Se pueden usar parcialmente, pero sólo de
izquierda a derecha (prefijo):
(2,1,1)

(2,1,2)

(2,2,0)

(2,2,1)

(2,3,0)

(3,1,2)
Columnas múltiples
• Alternativa: hashing
ALTER TABLE ADD [UNIQUE] INDEX hash
(hash);
INSERT INTO users SET first=‘Pompa’,
last=‘Borges’,
hash=md5(‘PompaBorges’);
NULL
• (NULL = x) es falso para todo x, inclusive NULL
• Al recorrer un índice usando los operadores no
relacionados con NULL, se ignoran las filas con
índice de valor NULL
• Necesitamos <=>, IS NULL, etc., para
analizarlas
EXPLAIN
• EXPLAIN nos sirve para corroborar que una
consulta se esté ejecutando como esperamos
que ejecute
EXPLAIN
> explain select Id from votes where PostId=23452635G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: votes

type: ref

possible_keys: postid

key: postid

key_len: 4

ref: const

rows: 5

Extra: Using index

1 row in set (0.04 sec)
EXPLAIN: rows
• Es una estimación de cuántas filas van a ser
leídas en la tabla
• Si el producto de todos los rows es demasiado
grande, probablemente estemos usando índices
equivocados
EXPLAIN: rows
> explain select count(*) from votes join posts on votes.PostId = posts.Id where posts.Score > 10;	
+------+-------------+-------+--------+---------------+---------+---------+-------------------+--------+-------------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+--------+---------------+---------+---------+-------------------+--------+-------------+	
| 1 | SIMPLE | votes | ALL | NULL | NULL | NULL | NULL | 427399 | |	
| 1 | SIMPLE | posts | eq_ref | PRIMARY | PRIMARY | 4 | unix.votes.PostId | 1 | Using where |	
+———+-------------+-------+--------+---------------+---------+---------+-------------------+--------+-------------+	
!
> alter table votes add index postid (PostId);	
> analyze table votes;	
!
> explain select count(*) from votes join posts on votes.PostId = posts.Id where posts.Score > 10;	
+------+-------------+-------+------+---------------+--------+---------+---------------+--------+-------------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+------+---------------+--------+---------+---------------+--------+-------------+	
| 1 | SIMPLE | posts | ALL | PRIMARY | NULL | NULL | NULL | 134217 | Using where |	
| 1 | SIMPLE | votes | ref | postid | postid | 4 | unix.posts.Id | 2 | Using index |	
+------+-------------+-------+------+---------------+--------+---------+---------------+--------+-------------+
EXPLAIN: key y ref
• possible_keys lista las claves candidatas.
• La clave usada es elegida en base a
estadísticas de las tablas.
• ref nos muestra contra qué columna ó constante
se compara el índice.
• Nos sirve para corroborar que el JOIN se
ejecute como pensamos que es mejor
EXPLAIN: type
• const/system: A lo sumo una fila coincidente
• eq_ref: A lo sumo una fila es leída por cada combinación de las tablas
anteriores. Aparece cuando se usa todo el índice y es PRIMARY/UNIQUE.
• ref: Todas las filas de cada valor coincidente a la combinación de las
tablas anteriores es leída.
• ref_or_null: Ídem, pero con una pasa extra para NULL
• range: Se consulta un rango específico del índice (<, BETWEEN)
• ALL: #FAIL!
• index: Ídem, pero hay un índice que proporciona los datos. Muestra
“Using index” en Extra.
> explain select DisplayName from users where Id = 60;	
+------+-------------+-------+-------+---------------+---------+---------+-------+------+-------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+-------+---------------+---------+---------+-------+------+-------+	
| 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | |	
+———+-------------+-------+-------+---------------+---------+---------+-------+------+-------+	
!
> explain select DisplayName from users where AccountId = 60;	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+	
| 1 | SIMPLE | users | ref | accname | accname | 4 | const | 1 | Using index |	
+———+-------------+-------+------+---------------+---------+---------+-------+------+-------------+	
!
> explain select * from posts join users on users.Id = posts.OwnerUserId;	
+------+-------------+-------+--------+---------------+---------+---------+---------------------------------+---------+-------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+--------+---------------+---------+---------+---------------------------------+---------+-------+	
| 1 | SIMPLE | posts | ALL | NULL | NULL | NULL | NULL | 9011718 | |	
| 1 | SIMPLE | users | eq_ref | PRIMARY | PRIMARY | 4 | stackoverflow.posts.OwnerUserId | 1 | |	
+------+-------------+-------+--------+---------------+---------+---------+---------------------------------+---------+-------+
EXPLAIN: Extra
• Using filesort
• Se está ejecutando una pasada adicional para ordenar filas
• Using index [for group by]
• Infame denominación
• Se está usando el índice para obtener los resultados (no necesariamente para
recorrer la tabla).
• Using temporary
• Se necesita una tabla temporal para resolver GROUP BY/ORDER BY.
• Using where
• Se está filtrando las filas luego de seleccionadas
• Tiene que aparecer si es ALL/index, a no ser que queramos un full table scan.
Covering indexes
• El índice tiene una copia del dato
• Cuando todos los datos de la consulta se pueden
extraer del índice, no es necesario analizar la fila
• Se evitan locking, búsquedas en disco, etc.
• Lo vemos en la salida de EXPLAIN como
• type de ref hacia arriba (ref, const, etc.)
• “Using index” en Extra
> explain select AccountId, DisplayName, Age from users where AccountId = 67;	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------+	
| 1 | SIMPLE | users | ref | accname | accname | 4 | const | 1 | |	
+———+-------------+-------+------+---------------+---------+---------+-------+------+-------+	
!
> explain select AccountId, DisplayName from users where AccountId = 67;	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+	
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+	
| 1 | SIMPLE | users | ref | accname | accname | 4 | const | 1 | Using index |	
+------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
Referencias
• MySQL 5.7 manual
• http://dev.mysql.com/doc/refman/
5.7/
• High Performance MySQL 3rd edition
!
Ignacio Nin

(@nachexnachex)

Más contenido relacionado

Similar a Índices en MySQL

Material Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de DatosMaterial Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de Datosliras loca
 
TSQL menos frecuente desde SQL Server 2005
TSQL menos frecuente desde SQL Server 2005TSQL menos frecuente desde SQL Server 2005
TSQL menos frecuente desde SQL Server 2005SolidQ
 
Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Julián Castiblanco
 
Afinamientodebasesdedatosyservidoreswebs
AfinamientodebasesdedatosyservidoreswebsAfinamientodebasesdedatosyservidoreswebs
Afinamientodebasesdedatosyservidoreswebsricardosusa5
 
Sentencias SQL.pptx
Sentencias SQL.pptxSentencias SQL.pptx
Sentencias SQL.pptxValLerm1
 
Como leer planes de ejecución
Como leer planes de ejecuciónComo leer planes de ejecución
Como leer planes de ejecuciónSpanishPASSVC
 
Cuellos botella en PostgreSQL
Cuellos botella en PostgreSQLCuellos botella en PostgreSQL
Cuellos botella en PostgreSQLEQ SOFT EIRL
 
Vistazo a SQL Server 2016
Vistazo a SQL Server 2016Vistazo a SQL Server 2016
Vistazo a SQL Server 2016Eduardo Castro
 
Sql dinamico14042011
Sql dinamico14042011Sql dinamico14042011
Sql dinamico14042011josecuartas
 
Vistazo a lo nuevo en SQL Server 2016
Vistazo a lo nuevo en SQL Server 2016Vistazo a lo nuevo en SQL Server 2016
Vistazo a lo nuevo en SQL Server 2016Eduardo Castro
 
Colegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquiColegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquifitese
 
Colegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquiColegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquifitese
 
Colegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquiColegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquifitese
 

Similar a Índices en MySQL (20)

Bases de Datos Masivas Corte I.pptx
Bases de Datos Masivas Corte I.pptxBases de Datos Masivas Corte I.pptx
Bases de Datos Masivas Corte I.pptx
 
Material Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de DatosMaterial Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de Datos
 
TSQL menos frecuente desde SQL Server 2005
TSQL menos frecuente desde SQL Server 2005TSQL menos frecuente desde SQL Server 2005
TSQL menos frecuente desde SQL Server 2005
 
Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2
 
Optimiza tus queries desde abajo
Optimiza tus queries desde abajoOptimiza tus queries desde abajo
Optimiza tus queries desde abajo
 
Afinamientodebasesdedatosyservidoreswebs
AfinamientodebasesdedatosyservidoreswebsAfinamientodebasesdedatosyservidoreswebs
Afinamientodebasesdedatosyservidoreswebs
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sql
 
Sentencias SQL.pptx
Sentencias SQL.pptxSentencias SQL.pptx
Sentencias SQL.pptx
 
Presentacións Sql mejorado
Presentacións Sql mejoradoPresentacións Sql mejorado
Presentacións Sql mejorado
 
Como leer planes de ejecución
Como leer planes de ejecuciónComo leer planes de ejecución
Como leer planes de ejecución
 
Cuellos botella en PostgreSQL
Cuellos botella en PostgreSQLCuellos botella en PostgreSQL
Cuellos botella en PostgreSQL
 
Pres17BDII.ppt
Pres17BDII.pptPres17BDII.ppt
Pres17BDII.ppt
 
Vistazo a SQL Server 2016
Vistazo a SQL Server 2016Vistazo a SQL Server 2016
Vistazo a SQL Server 2016
 
Tsql
TsqlTsql
Tsql
 
Sql dinamico14042011
Sql dinamico14042011Sql dinamico14042011
Sql dinamico14042011
 
SQL avanzado
SQL avanzadoSQL avanzado
SQL avanzado
 
Vistazo a lo nuevo en SQL Server 2016
Vistazo a lo nuevo en SQL Server 2016Vistazo a lo nuevo en SQL Server 2016
Vistazo a lo nuevo en SQL Server 2016
 
Colegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquiColegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruqui
 
Colegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquiColegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruqui
 
Colegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruquiColegio fiscal tecnico yaruqui
Colegio fiscal tecnico yaruqui
 

Último

Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 

Último (16)

Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 

Índices en MySQL

  • 2. — @fedesilva, Tech Meetup 2012 “Todo programador debe ser un sysadmin competente."
  • 3. Optimización Asignar los índices correctos es la forma mas eficiente de optimizar • 10% del trabajo • 90% de los resultados
  • 4. Índices • MSSQL puede auto asignar los índices de acuerdo a estadísticas de uso • MySQL • Usualmente manual • De acuerdo a los casos de uso
  • 5. Regla rápida • Columnas usadas en la cláusula WHERE • Columnas con las que se hacen JOINs
  • 6. Regla rápida > select SQL_NO_CACHE count(*) from posts join users on users.Id = posts.OwnerUserId where users.age > 30; +----------+ | count(*) | +----------+ | 27887 | +----------+ 1 row in set (0.20 sec) ! > alter table posts add index owner (OwnerUserId); ! > select SQL_NO_CACHE count(*) from posts join users on users.Id = posts.OwnerUserId where users.age > 30; +----------+ | count(*) | +----------+ | 27887 | +----------+ 1 row in set (0.11 sec) ! > alter table users add index age (Age); ! > select SQL_NO_CACHE count(*) from posts join users on users.Id = posts.OwnerUserId where users.age > 30; +----------+ | count(*) | +----------+ | 27887 | +----------+ 1 row in set (0.06 sec)
  • 7. PRIMARY KEY • Única • InnoDB: Los datos se ordenan en el disco de acuerdo a su clave primaria • Si no hay una clave obvia, conviene agregar una columna arbitraria, auto_increment (90% de los casos)
  • 8. UNIQUE KEY • Mismas optimizaciones que la clave primaria • Tamaño promedio del grupo de valor 1
  • 9. FOREIGN KEY • Usamos la clave desde otra tabla • Restricciones de negocio • :)
  • 10. Columnas múltiples • Se pueden usar parcialmente, pero sólo de izquierda a derecha (prefijo): (2,1,1)
 (2,1,2)
 (2,2,0)
 (2,2,1)
 (2,3,0)
 (3,1,2)
  • 11. Columnas múltiples • Alternativa: hashing ALTER TABLE ADD [UNIQUE] INDEX hash (hash); INSERT INTO users SET first=‘Pompa’, last=‘Borges’, hash=md5(‘PompaBorges’);
  • 12. NULL • (NULL = x) es falso para todo x, inclusive NULL • Al recorrer un índice usando los operadores no relacionados con NULL, se ignoran las filas con índice de valor NULL • Necesitamos <=>, IS NULL, etc., para analizarlas
  • 13. EXPLAIN • EXPLAIN nos sirve para corroborar que una consulta se esté ejecutando como esperamos que ejecute
  • 14. EXPLAIN > explain select Id from votes where PostId=23452635G
 *************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: votes
 type: ref
 possible_keys: postid
 key: postid
 key_len: 4
 ref: const
 rows: 5
 Extra: Using index
 1 row in set (0.04 sec)
  • 15. EXPLAIN: rows • Es una estimación de cuántas filas van a ser leídas en la tabla • Si el producto de todos los rows es demasiado grande, probablemente estemos usando índices equivocados
  • 16. EXPLAIN: rows > explain select count(*) from votes join posts on votes.PostId = posts.Id where posts.Score > 10; +------+-------------+-------+--------+---------------+---------+---------+-------------------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+--------+---------------+---------+---------+-------------------+--------+-------------+ | 1 | SIMPLE | votes | ALL | NULL | NULL | NULL | NULL | 427399 | | | 1 | SIMPLE | posts | eq_ref | PRIMARY | PRIMARY | 4 | unix.votes.PostId | 1 | Using where | +———+-------------+-------+--------+---------------+---------+---------+-------------------+--------+-------------+ ! > alter table votes add index postid (PostId); > analyze table votes; ! > explain select count(*) from votes join posts on votes.PostId = posts.Id where posts.Score > 10; +------+-------------+-------+------+---------------+--------+---------+---------------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+------+---------------+--------+---------+---------------+--------+-------------+ | 1 | SIMPLE | posts | ALL | PRIMARY | NULL | NULL | NULL | 134217 | Using where | | 1 | SIMPLE | votes | ref | postid | postid | 4 | unix.posts.Id | 2 | Using index | +------+-------------+-------+------+---------------+--------+---------+---------------+--------+-------------+
  • 17. EXPLAIN: key y ref • possible_keys lista las claves candidatas. • La clave usada es elegida en base a estadísticas de las tablas. • ref nos muestra contra qué columna ó constante se compara el índice. • Nos sirve para corroborar que el JOIN se ejecute como pensamos que es mejor
  • 18. EXPLAIN: type • const/system: A lo sumo una fila coincidente • eq_ref: A lo sumo una fila es leída por cada combinación de las tablas anteriores. Aparece cuando se usa todo el índice y es PRIMARY/UNIQUE. • ref: Todas las filas de cada valor coincidente a la combinación de las tablas anteriores es leída. • ref_or_null: Ídem, pero con una pasa extra para NULL • range: Se consulta un rango específico del índice (<, BETWEEN) • ALL: #FAIL! • index: Ídem, pero hay un índice que proporciona los datos. Muestra “Using index” en Extra.
  • 19. > explain select DisplayName from users where Id = 60; +------+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | | +———+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ ! > explain select DisplayName from users where AccountId = 60; +------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | users | ref | accname | accname | 4 | const | 1 | Using index | +———+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ ! > explain select * from posts join users on users.Id = posts.OwnerUserId; +------+-------------+-------+--------+---------------+---------+---------+---------------------------------+---------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+--------+---------------+---------+---------+---------------------------------+---------+-------+ | 1 | SIMPLE | posts | ALL | NULL | NULL | NULL | NULL | 9011718 | | | 1 | SIMPLE | users | eq_ref | PRIMARY | PRIMARY | 4 | stackoverflow.posts.OwnerUserId | 1 | | +------+-------------+-------+--------+---------------+---------+---------+---------------------------------+---------+-------+
  • 20. EXPLAIN: Extra • Using filesort • Se está ejecutando una pasada adicional para ordenar filas • Using index [for group by] • Infame denominación • Se está usando el índice para obtener los resultados (no necesariamente para recorrer la tabla). • Using temporary • Se necesita una tabla temporal para resolver GROUP BY/ORDER BY. • Using where • Se está filtrando las filas luego de seleccionadas • Tiene que aparecer si es ALL/index, a no ser que queramos un full table scan.
  • 21. Covering indexes • El índice tiene una copia del dato • Cuando todos los datos de la consulta se pueden extraer del índice, no es necesario analizar la fila • Se evitan locking, búsquedas en disco, etc. • Lo vemos en la salida de EXPLAIN como • type de ref hacia arriba (ref, const, etc.) • “Using index” en Extra
  • 22. > explain select AccountId, DisplayName, Age from users where AccountId = 67; +------+-------------+-------+------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | users | ref | accname | accname | 4 | const | 1 | | +———+-------------+-------+------+---------------+---------+---------+-------+------+-------+ ! > explain select AccountId, DisplayName from users where AccountId = 67; +------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | users | ref | accname | accname | 4 | const | 1 | Using index | +------+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
  • 23. Referencias • MySQL 5.7 manual • http://dev.mysql.com/doc/refman/ 5.7/ • High Performance MySQL 3rd edition ! Ignacio Nin
 (@nachexnachex)