Tengo una tabla Assets
en un motor InnoDB definen como:Índices y el uso de las claves principales como los índices de MySQL
CREATE TABLE Assets (
qid SMALLINT(5) NOT NULL,
sid BIGINT(20) NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (sid,qid),
KEY sid (sid)
);
estoy ejecutando la siguiente consulta:
SELECT COUNT(*) FROM Assets WHERE sid>10000;
En mi máquina, esta consulta lleva unos 30 segundos con 2 millones de entradas en la tabla. Ahora bien, si modifico la consulta para utilizar índices, los resultados varían ampliamente:
SELECT COUNT(*) FROM Assets USE INDEX(<index>) WHERE sid>10000;
NO INDEX
: No explícitaUSE INDEX
, es decir, el primerSELECT
consulta: 30 segundosKEY sid (sid)
: 1,5 segsKEY cid (sid,qid)
: 1,5 segundosPRIMARY
: utilicéUSE INDEX(PRIMARY)
dentro de la consulta. : 30 segundos
Así que estas son mis preguntas:
pensé que una consulta sería utilizar automáticamente la clave primaria como su índice, basado en this. Y, sin embargo, hay una gran diferencia entre
USE INDEX (cid)
yNO INDEX
. ¿Cual es la diferencia? Además, ¿cómo doy explícitamente la clave principal como índice?Si
NO INDEX
no usa realmente la clave principal como índice, ¿qué haceUSE INDEX(PRIMARY)
que tenga el mismo tiempo de ejecución queNO INDEX
?¿Hay alguna diferencia (no sólo se refiere a rendimiento) entre
USE INDEX(sid)
yUSE INDEX(cid)
en una consulta que sólo filtra porsid
?
Perdonen la publicación larga, pero quiero que sea abierta a discusión.
Ok, esto es lo que he encontrado hasta ahora:
En primer lugar, me han dicho la clave de configuración, debe ser: PRIMARY KEY(qid,sid), KEY(sid)
o PRIMARY KEY(sid,qid), KEY(qid)
. Realmente no entiendo la diferencia. Si alguien lo hace, házmelo saber.
En segundo lugar, la LLAVE sid
(sid
) hace referencia a muchas menos páginas de índice que una clave más grande, por lo que tiende a ser más rápida. En cuanto a la diferencia entre utilizar PRIMARY KEY como índice y una KEY adecuada (incluso si usan los mismos campos), me dijeron que es algo como esto:
Las claves principales indexan los datos de la tabla completa con los campos de la clave principal. Eso significa que la PRIMARY KEY y los datos se almacenan juntos. Por lo tanto, una consulta que use PRIMARY KEY debería pasar por toda la tabla de datos, que incluso indexada se empantanaría en tablas grandes e incavocables.
Con teclas discretas, el número de filas puede ser el mismo, pero se escanea un índice mucho más pequeño (que consta de los campos indicados), lo que afecta a un número menor de bloques de disco y, por lo tanto, se ejecuta mucho más rápido. Supongo que este es también el motivo de la diferencia en el uso de USE INDEX(cid)
y el uso de la clave principal como índice, que tienen los mismos campos.
Sólo una nota : si tiene 'PRIMARY KEY (sid, qid)' then 'KEY sid (sid)' no tiene sentido – zerkms
PD: ponga EXPLAIN para 'SELECT COUNT (*) FROM Assets DONDE sid> 10000' please – zerkms
cuantas filas con' sid> 10000' del total de 2M? Si es más que ~ 30%, entonces mysql decide que fullscan es más barato. Y es por eso que forzar índice ayuda – zerkms