¿Cuán escalable es SQLite? [cerrado]

Respuestas:

429

Ayer lancé un sitio pequeño *para rastrear a su representante que utilizó una base de datos SQLite compartida para todos los visitantes. Desafortunadamente, incluso con la modesta carga que ejerció sobre mi host, funcionó bastante lentamente. Esto se debe a que toda la base de datos se bloqueó cada vez que alguien vio la página porque contenía actualizaciones / inserciones. Pronto cambié a MySQL y aunque no he tenido mucho tiempo para probarlo, parece mucho más escalable que SQLite. Solo recuerdo cargas lentas de página y ocasionalmente un error de base de datos bloqueada cuando intento ejecutar consultas desde el shell en sqlite. Dicho esto, estoy ejecutando otro sitio desde SQLite muy bien. La diferencia es que el sitio es estático (es decir, yo soy el único que puede cambiar la base de datos) y, por lo tanto, funciona bien para lecturas concurrentes. Moraleja de la historia:

editar : Acabo de darme cuenta de que puede que no haya sido justo con SQLite: no indicé ninguna columna en la base de datos SQLite cuando la estaba sirviendo desde una página web. Esto causó parcialmente la desaceleración que estaba experimentando. Sin embargo, la observación de los soportes de bloqueo de la base de datos: si tiene actualizaciones particularmente onerosas, el rendimiento de SQLite no coincidirá con MySQL o Postgres.

Otra edición: desde que publiqué esto hace casi 3 meses, tuve la oportunidad de examinar de cerca la escalabilidad de SQLite, y con algunos trucos puede ser bastante escalable. Como mencioné en mi primera edición, los índices de la base de datos reducen drásticamente el tiempo de consulta, pero esto es más una observación general sobre las bases de datos que sobre SQLite. Sin embargo, hay otro truco que puede usar para acelerar SQLite: las transacciones . Siempre que tenga que hacer múltiples escrituras de bases de datos, colóquelas dentro de una transacción. En lugar de escribir (y bloquear) el archivo cada vez que se emite una consulta de escritura, la escritura solo ocurrirá una vez que se complete la transacción.

El sitio que mencioné que publiqué en el primer párrafo se ha cambiado nuevamente a SQLite, y está funcionando sin problemas una vez que ajusté mi código en algunos lugares.

* el sitio ya no está disponible

Kyle Cronin
fuente
3
El motor de base de datos "clásico" de MySQL, MyISAM, tiene los mismos problemas relacionados con las operaciones de lectura / escritura concurrentes que SQLite. De hecho, bloquea cada fila que toca en una operación de escritura, lo que hace imposible escalar las aplicaciones de escritura intensiva. Aún así, sirvió muchas aplicaciones web muy bien.
Henning
1
¿Podrías reescribir el comienzo de tu respuesta entonces? Juzgar el desempeño de DB sin índices apropiados es completamente injusto. Además, las transacciones cambian mucho el rendimiento y la escalabilidad de SQLite.
Kornel
3
@porneL: Cierto, pero SQLite sin índices fue un orden de magnitud más lento que MySQL sin índices, y también incluí un poco sobre transacciones en mi segunda edición. Sigo pensando que la progresión de la respuesta tiene algún sentido: muestra mi uso ingenuo inicial de SQLite y lo relativamente malo que fue el rendimiento. Espero que los nuevos en la plataforma encuentren problemas similares, y espero que puedan identificarse con el primer párrafo, luego leer las siguientes ediciones y darse cuenta de que hay formas de acelerar SQLite para tener un rendimiento aceptable.
Kyle Cronin
1
¿Puede compartir con nosotros aproximadamente cuántas visitas por segundo obtiene su sitio?
NoobOverflow
2
También hay registros de escritura anticipada (WAL) disponibles en las versiones más recientes de SQLite que pueden eliminar parte del dolor de los ciclos de lectura / escritura. Las cosas cambian.
Lasse V. Karlsen
58

Sqlite es escalable en términos de usuario único, tengo una base de datos de varios gigabytes que funciona muy bien y no he tenido muchos problemas con ella.

Pero es de un solo usuario, por lo que depende de qué tipo de escala esté hablando.

En respuesta a los comentarios. Tenga en cuenta que no hay nada que impida el uso de una base de datos Sqlite en un entorno multiusuario, pero cada transacción (en efecto, cada instrucción SQL que modifica la base de datos) bloquea el archivo , lo que evitará que otros usuarios accedan a la base de datos en todos .

Entonces, si tiene muchas modificaciones realizadas en la base de datos, esencialmente tendrá problemas de escala muy rápido. Si, por otro lado, tiene mucho acceso de lectura en comparación con el acceso de escritura, puede que no sea tan malo.

Pero Sqlite, por supuesto, funcionará en un entorno multiusuario, pero no funcionará bien.

Lasse V. Karlsen
fuente
55
SQLite 3 admite la lectura cuando otros usuarios le escriben.
Alix Axel
2
Tenga en cuenta que los comentarios anteriores están desactualizados, con el nuevo sistema WAL, las escrituras y las lecturas se pueden realizar al mismo tiempo, lo que aumenta la escalabilidad.
Lasse V. Karlsen
¿Es posible crear para exportar registros sobre la marcha a sqlite desde cualquier rdbms como sql server u oracle, etc.?
ILoveStackoverflow
29

SQLite maneja el sitio web sqlite.org y otros que tienen mucho tráfico. Sugieren que si tiene menos de 100k visitas por día, SQLite debería funcionar bien. Y eso fue escrito antes de que entregaran la función "Registro de escritura anticipada".

Si desea acelerar las cosas con SQLite, haga lo siguiente:

  • actualizar a SQLite 3.7.x
  • Habilitar el registro de escritura anticipada
  • Ejecute el siguiente pragma: "PRAGMA cache_size = Number-of-pages;" El tamaño predeterminado (Número de páginas) es de 2000 páginas, pero si aumenta ese número, aumentará la cantidad de datos que se está ejecutando directamente de la memoria.

Es posible que desee ver mi video en YouTube llamado " Mejorar el rendimiento de SQLite con el registro de escritura anticipada ", que muestra cómo utilizar el registro de escritura anticipada y demuestra una mejora de velocidad 5x para las escrituras.

Jay Godse
fuente
24

Sqlite es una base de datos de escritorio o en proceso . SQL Server, MySQL, Oracle y sus hermanos son servidores .

Las bases de datos de escritorio no son, por su propia naturaleza, una buena opción para ninguna aplicación que necesite admitir el acceso de escritura concurrente al almacén de datos. Esto incluye en algún nivel la mayoría de los sitios web creados. Si incluso tiene que iniciar sesión para algo, probablemente necesite acceso de escritura a la base de datos.

Joel Coehoorn
fuente
55
No estoy de acuerdo con 'Esto incluye casi todos los sitios web que se hayan creado'. comentario. Si el sitio web tiene mucha carga, estás en lo correcto. Trac, por ejemplo, usa SQLite de forma predeterminada y funciona muy bien desde el primer momento para equipos pequeños.
Andrew Burns
2
Dale tiempo: tendrás dos desarrolladores que acceden al mismo campo al mismo tiempo y se ahogará.
Joel Coehoorn
3
¿Qué define como estrangulador? por su respuesta, supongo que no tiene mucha experiencia con SQLite. SQLite bloqueará todo el archivo en las operaciones, por lo que puede experimentar un retraso, pero es casi imposible que se 'ahogue' en la situación que propuso.
Andrew Burns
3
Andrew, debido a que SQL Lite funciona bien para equipos pequeños, no lo hace escalable, ya que el requisito es escalable, lo que significa que debería funcionar bien con equipos grandes. Que yo sepa, SQL Lite no es escalable a equipos grandes / operaciones concurrentes de bases de datos que exceden un umbral bastante bajo.
Pop Catalin
55
@Justicia. Esta respuesta no tiene evidencia de cuán escalable es SQLite. La respuesta de nadie es mucho mejor.
GateKiller
23

¿Has leído estos documentos de SQLite: http://www.sqlite.org/whentouse.html ?

SQLite generalmente funcionará muy bien como motor de base de datos para sitios web de tráfico bajo a medio (es decir, el 99.9% de todos los sitios web). La cantidad de tráfico web que SQLite puede manejar depende, por supuesto, de cuán fuertemente el sitio web use su base de datos. En términos generales, cualquier sitio que obtenga menos de 100K visitas / día debería funcionar bien con SQLite. La cifra de 100K visitas / día es una estimación conservadora, no un límite superior difícil. Se ha demostrado que SQLite funciona con 10 veces esa cantidad de tráfico.

Sam
fuente
3
Estoy muy de acuerdo con esto. El 99% de los sitios web pueden manejarse bien con SQLLite si así lo desea. Pero, el 99% del tráfico web va al 1% más grande de sitios web, por otro lado.
djangofan
77
La métrica de "100k visitas / día" es basura total. Un "hit" se define típicamente como un HTTP GET y un sitio web con un montón de imágenes divididas puede obtener más de 40 "hits" por página vista, ninguna de las cuales toca la base de datos. Incluso si los documentos cometen el error de golpear == página vista, sigue siendo engañoso. SQLite bloquea toda la base de datos en una escritura. Si bien puede servir valientemente 100k páginas vistas de personas que solo buscan registros, se desmoronará en una aplicación de escritura intensiva (comercio electrónico, tablero de mensajes, etc.).
jamieb
10

La escalabilidad de SQLite dependerá en gran medida de los datos utilizados y su formato. He tenido una experiencia difícil con tablas extra largas (registros GPS, un registro por segundo). La experiencia demostró que SQLite se ralentizaría por etapas, en parte debido al reequilibrio constante de los árboles binarios en crecimiento que contienen los índices (y con los índices con marca de tiempo, solo sabe que el árbol se reequilibrará mucho, pero es vital para su búsquedas). Entonces, al final, alrededor de 1 GB (muy amplio, lo sé), las consultas se vuelven lentas en mi caso. Su kilometraje variará.

Una cosa para recordar, a pesar de toda la jactancia, SQLite NO está hecho para el almacenamiento de datos. Hay varios usos no recomendados para SQLite. Las buenas personas detrás de SQLite lo dicen ellos mismos:

Otra forma de ver SQLite es esta: SQLite no está diseñado para reemplazar a Oracle. Está diseñado para reemplazar fopen ().

Y esto lleva al argumento principal (no cuantitativo, lo siento, pero cualitativo), SQLite no es para todos los usos, mientras que MySQL puede cubrir muchos usos variados, incluso si no es ideal. Por ejemplo, podría tener MySQL almacenar cookies de Firefox (en lugar de SQLite), pero necesitaría que ese servicio se ejecute todo el tiempo. Por otro lado, podría tener un sitio web transaccional ejecutándose en SQLite (como lo hace mucha gente) en lugar de MySQL, pero espera mucho tiempo de inactividad.

MPelletier
fuente
1
Puede solucionar el problema de tener tablas indexadas muy grandes fragmentando sus datos, por ejemplo, una tabla por día / semana. SQLite incluso le permite dividir las tablas en archivos de bases de datos distintos y luego usarlos ATTACH DATABASEpara crear una conexión de base de datos virtual con todas las tablas (sin embargo, limitado a 62 bases de datos).
Alix Axel
3

Creo que un servidor web (en el número 1) que sirve a cientos de clientes aparece en el backend con una única conexión a la base de datos, ¿no?

Por lo tanto, no hay acceso concurrente en la base de datos y, por lo tanto, podemos decir que la base de datos funciona en 'modo de usuario único'. No tiene sentido acceder a múltiples usuarios de diskuss en tales circunstancias, por lo que SQLite funciona tan bien como cualquier otra base de datos basada en servidor.

Hielo
fuente
1
Thx GateKiller, pero especifique "sitio web de bajo volumen".
Hielo
3

Piénsalo de esta manera. SQL Lite se bloqueará cada vez que alguien lo use (SQLite no bloquea la lectura). Entonces, si está sirviendo una página web o una aplicación que tiene múltiples usuarios concurrentes, solo uno podría usar su aplicación a la vez con SQLLite. Entonces, hay un problema de escala. Si se trata de una aplicación para una sola persona, por ejemplo, una Biblioteca de música en la que tienes cientos de títulos, clasificaciones, información, uso, reproducción y tiempo de reproducción, entonces SQL Lite escalará maravillosamente con miles, si no millones, de discos (si el disco duro lo permite)

MySQL, por otro lado, funciona bien para aplicaciones de servidores donde la gente de todo el mundo lo usará simultáneamente. No se bloquea y es bastante grande en tamaño. Entonces, para su biblioteca de música, MySql se acabaría como solo una persona lo vería, A MENOS QUE sea una biblioteca de música compartida donde miles la agregan o actualizan. Entonces MYSQL sería el que usaría.

Entonces, en teoría, MySQL escala mejor que Sqllite porque puede manejar múltiples usuarios, pero es excesivo para una aplicación de usuario único.

halcón peregrino
fuente
55
s / lo usa / escribe en él. sqlite no se bloquea en la lectura.
Gregg Lind
55
bueno, tu respuesta puede malinterpretarse fácilmente. SQLite se bloquea solo en solicitudes de escritura . Estamos utilizando SQLite con más de 50 GB de datos médicos en forma relacional y brindamos servicio a cientos de clientes web simultáneos para navegar y consultar. Su rendimiento de lectura nunca es peor que un MySQL reciente.
Berk D. Demir el
3
MyISAM de MySQL no es mucho mejor para el acceso concurrente que SQLite. MySQL usa mucho bloqueos a nivel de tabla, y no hará escrituras concurrentes, excepto en algunos casos donde el diseño de MyISAM es óptimo. A menos que elija InnoDB (que tiene sus propios problemas, como un archivo de datos que nunca se reduce), es posible que no esté mucho mejor con MySQL.
Kornel
1

El sitio web de SQLite (la parte a la que hizo referencia) indica que se puede usar para una variedad de situaciones multiusuario.

Yo diría que puede manejar bastante. En mi experiencia, siempre ha sido muy rápido. Por supuesto, debe indexar sus tablas y al codificarlas, debe asegurarse de usar consultas parameritizadas y similares. Básicamente, lo mismo que haría con cualquier base de datos para mejorar el rendimiento.

jle
fuente
y usar transacciones. Eso es crucial para SQLite.
Kornel
-1

Puede valer la pena echarle un vistazo a REAL SQL Server , que es un servidor de base de datos construido en SQLite.

Paul Lefebvre
fuente
77
No creo que ningún sitio justifique gastar $ 299 por "REAL SQL Server" cuando la mayoría de los sitios no reciben suficiente tráfico para comenzar a alcanzar los límites de SQLLite.
djangofan