utilizar índices para todas las posibles condiciones de igualdad N
en columnas, necesitará C([N/2], N)
índices, es decir N!/([N/2]! * (N - [N/2])!)
Lee este artículo en mi blog para explicaciones detalladas:
También puede leer la estricta matemática proof por el matemático ruso Egor Timoshenko
(actualización: ahora en Inglés).
se puede, no obstante, obtener un rendimiento decente con menos índices empleando las siguientes técnicas:
Índice de fusión
Si las columnas col1
, col2
y col3
son selectivos, entonces esta consulta
SELECT *
FROM mytable
WHERE col1 = :value1
AND col2 = :value2
AND col3 = :value3
puede usar tres índices separados en col1
, col2
y col3
, seleccionar los ROWID
's que coinciden con cada condición por separado y a encontrar su intersección, como en:
SELECT *
FROM (
SELECT rowid
FROM mytable
WHERE col1 = :value1
INTERSECT
SELECT rowid
FROM mytable
WHERE col2 = :value2
INTERSECT
SELECT rowid
FROM mytable
WHERE col3 = :value3
) mo
JOIN mytable mi
ON mi.rowid = mo.rowid
mapa de bits de indexación
PostgreSQL
puede construir índices de mapa de bits en la memoria temporal derecha durante la consulta.
Un índice de mapa de bits es una matriz de bits contigua bastante compacta.
Cada bit configurado para la matriz indica que la correspondencia tid
se debe seleccionar de la tabla.
Tal índice puede tomar pero 128M
de almacenamiento temporal para una tabla con 1G
filas.
La siguiente consulta:
SELECT *
FROM mytable
WHERE col1 = :value1
AND col2 = :value2
AND col3 = :value3
primero asignar un mapa de bits rellenado con ceros lo suficientemente grande como para cubrir todas las posibles tid
's en la tabla (que es lo suficientemente grande como para tomar todas las tid
' s de (0, 0)
a la último tid, no tomando tid
's faltantes en cuenta).
A continuación, buscará el primer índice, estableciendo los bits en 1
si cumplen la primera condición.
Luego escaneará el segundo índice, AND
'los bits que satisfacen la segunda condición con un 1
. Esto dejará 1
solo para aquellos bits que satisfagan ambas condiciones.
Lo mismo para el tercer índice.
Finalmente, solo seleccionará las filas con el tid
correspondiente al conjunto de bits.
El tid
se buscará secuencialmente, por lo que es muy eficiente.
Esta es la respuesta correcta. MySQL funciona de la misma manera, y esta técnica se llama "Prefijo de la izquierda". Del manual de MySQL en http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html: "Si la tabla tiene un índice de varias columnas, cualquier prefijo situado más a la izquierda del índice puede ser utilizado por el optimizador para buscar filas. Por ejemplo, si tiene un índice de tres columnas en (col1, col2, col3), tiene capacidades de búsqueda indexadas en (col1), (col1, col2) y (col1, col2, col3) . " – zombat
Hmm, debería haber sabido esto. ;) Muy impresionante, voy a dar una oportunidad. –
Es posible que también necesite a, c, pero depende de cómo se vean sus consultas.También puede necesitar el índice individual para cubrir el escenario O mencionado por Andriyev, no estoy seguro. –