Android SQLite Rendimiento con índices

Mi aplicación de Android funciona utilizando una base de datos SQLite que se genera en el PC del usuario y se transfiere al dispositivo. Todo funciona, pero no había previsto el número de usuarios que tendrían grandes cantidades de datos. En estos casos, la interfaz de usuario es muy lenta, ya que espera a que se recojan los datos.

He intentado una serie de trucos que estaba "seguro" que aceleraría las cosas, pero nada parece tener ningún efecto notable. Mis consultas son casi todas muy simples, siendo por lo general un solo "col = val" para la cláusula WHERE, y datos INTEGER en la columna. Así que no puedo hacer mucho con las consultas.

Lo último, y no soy un experto en SQL por ningún medio, era utilizar los comandos "CREATE INDEX" en la PC, creyendo que estos índices se utilizan para acelerar las búsquedas de bases de datos. Los índices aumentaron el tamaño del archivo de base de datos de manera significativa, así que me sorprendió que parecía no tener ningún efecto en la velocidad de mi aplicación! Una pantalla que tardaba 8 segundos en llenar sin índices todavía tarda unos 8 segundos incluso con ellos. Yo estaba esperando para reducir las cosas a por lo menos la mitad de eso.

Lo que me pregunto en este momento es si la implementación de SQLite en Android utiliza índices de base de datos en absoluto, o si sólo estoy desperdiciando espacio generándolos. ¿Puede alguien responder a esto?

Además, ¿cualquier otra cosa para tratar de acelerar el acceso?

(Por lo que vale la pena, sobre una base absoluta los usuarios no tienen nada de que quejarse.Mi mal caso de los usuarios hasta el momento tiene datos que genera 630.000 registros (15 tablas), por lo que sólo hay mucho que es posible!

Doug Gordon Sistemas GHCS

Finalmente pude lograr enormes ganancias de rendimiento simplemente consultando la base de datos de una manera mucho más eficiente. Por ejemplo, al crear una matriz de información, antes estaba consultando la base de datos para cada fila que necesitaba con un selector de tipo "WHERE _id = n". Pero al hacerlo de esta manera, estaba emitiendo una docena o más consultas, una a la vez.

En su lugar, ahora crear una lista de identificadores que se requieren, a continuación, obtener todos ellos con una sola consulta de la forma "WHERE _id IN (n1, n2, n3, …)" e iterar a través del cursor devuelto. Haciendo esto y algunas otras optimizaciones de estructura, la base de datos más grande es ahora casi tan rápida de ver como el caso más promedio.

SQLite utilizará el índice si es apropiado para la consulta. Utilizar EXPLAIN

EXPLAIN QUERY PLAN ... your select statement ... 

Para ver qué índices utiliza SQLite. El plan de consulta se basa en algunas suposiciones sobre el contenido de la base de datos. Es posible que pueda mejorar el plan utilizando ANALYZE

Cada vez que vayas a realizar algún tipo de acción (como la búsqueda en la base de datos, el cálculo de larga duración, la solicitud web, etc.) que tardes más de un par de cientos de milisegundos, deberías considerar envolverlo dentro de AsyncTask .

El hilo sin dolor es un buen artículo sobre este tema, por lo que le recomiendo que eche un vistazo a él.

En este artículo se describe el modelo de subprocesamiento utilizado por las aplicaciones de Android y cómo las aplicaciones pueden garantizar el mejor rendimiento de la interfaz de usuario al desovar los subprocesos de trabajo para manejar las operaciones largas, en lugar de tratarlas en el subproceso principal.

  • Random () en sqlite y Android sdk
  • ¿Debo usar siempre transacciones en android sqlite?
  • Eliminación automática de objetos anidados en ORMLite
  • SherlockFragmentActivity con múltiples ListFragments y batallas con cursor SQLite
  • Datetime ('ahora') da tiempo equivocado
  • Cómo modificar el valor de un elemento en un SQLite?
  • Tratar una gran base de datos en Android
  • DB SQLite de Android Cuando cerrar
  • Sincronizar datos SQLite desde el teléfono Android a la base de datos MySQL de MySQL de Windows
  • La mejor manera de trabajar con las fechas en Android SQLite
  • La base de datos SQLite ..onCreate () no se está llamando
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.