También, I = (K + D-1)/D significa: K se supone número total de filas, y D es valores distintos para cada columna, así que si tabla creada con CREATE TABLE TEST (C1 INT, C2 TEXT, C3 INT, C4 INT);
y crear índice como CREATE INDEX IDX on TEST(C1, C2)
a continuación, se puede insertar o dejar que sqlite actualizar automáticamente la tabla sqlite_stat1 como manualmente: "TEST" -> nombre de tabla, "IDX" -> índice de nombres " 10000 1 1000 ", AQUÍ, 10000 es su número total de filas en TABLE TEST, 1 significa, para la columna C1, todos los valores parecen ser distintos, esto parece que C1 es algo así como IDs o lo que sea, 1000 significa que C2 tiene menos diferencias valor, como usted sabe, cuanto mayor es el valor, los valores menos distintos que el índice se refiere a la columna específica.
Puede ejecutar ANALYZE
o actualizar manualmente la tabla. (Mejor que lo primero).
Entonces, ¿para qué sirve el valor? sqlite utilizará estas estadísticas, para encontrar el mejor índice que quieren usar, puede considerar CREATE INDEX IDX2 ON TEST(C2)" AND the value in stat1 table is "10000 1
, y CREATE INDEX IDX1 ON TEST(C1)" with value "10000 100";
Supongamos que no tenemos el índice IDX que definimos anteriormente, cuando emite SELECT * FORM TEST WHERE C1=? AND C2=?
, sqlite elegirá IDX2, pero no IDX1, ¿por qué? Es simple, ya que IDX2 puede minimizar los resultados de la consulta, pero IDX1 no.
¿Borrar?
Acabo de encontrar que mi problema de rendimiento se debía a que faltaba un índice en una tabla de unión, pero era más intuitivo que diagnóstico. Realmente me gustaría entender más el proceso de diagnóstico del uso del índice SQLite. –