SQLite Nasıl Ölçeklenebilir? [kapalı]


178

Son zamanlarda SQLite vs MySQL hakkında bu soruyu okudum ve cevap SQLite iyi ölçeklenmediğini ve resmi web sitesi sıralama bunu doğruladı dikkat çekti .

SQLite ne kadar ölçeklenebilir ve en üst sınırları nelerdir?

Yanıtlar:


429

Dün küçük bir site yayınladım *tüm ziyaretçiler için paylaşılan bir SQLite veritabanı kullanan temsilcinizi izlemek için. Ne yazık ki, benim ev sahibi koymak mütevazı yük ile bile oldukça yavaş koştu. Bunun nedeni, birisinin sayfayı her görüntülediğinde tüm veritabanının kilitlenmiş olmasıdır, çünkü güncellemeler / ekler içerir. Yakında MySQL'e geçtim ve test etmek için fazla zamanım olmasa da, SQLite'den çok daha ölçeklenebilir görünüyor. Sadece yavaş sayfa yükleri ve zaman zaman sqlite kabuk sorguları yürütmeye çalışırken bir veritabanı kilitli hata almak hatırlıyorum. Yani, SQLite başka bir site çalıştırıyorum dedi. Aradaki fark, sitenin statik olmasıdır (yani veritabanını değiştirebilecek tek kişi benim) ve eşzamanlı okumalar için gayet iyi çalışıyor. Hikayeden çıkarılacak ders:

edit : Ben sadece SQLite adil olmayabilir fark ettim - Ben bir web sayfasından sunarken SQLite veritabanında herhangi bir sütun indeks vermedi. Bu kısmen yaşadığım yavaşlamaya neden oldu. Ancak, veritabanı kilitleme standlarının gözlemlenmesi - özellikle zahmetli güncellemeleriniz varsa, SQLite performansı MySQL veya Postgres ile eşleşmez.

başka bir düzenleme: Bunu neredeyse 3 ay önce gönderdiğimden beri SQLite'nin ölçeklenebilirliğini yakından inceleme fırsatım oldu ve birkaç hile ile oldukça ölçeklenebilir olabilir. İlk düzenlememde de belirttiğim gibi, veritabanı dizinleri sorgu süresini önemli ölçüde azaltır, ancak bu veritabanları hakkında SQLite'den daha genel bir gözlemdir. Ancak, SQLite: işlemleri hızlandırmak için kullanabileceğiniz başka bir hile var . Birden çok veritabanı yazımı yapmanız gerektiğinde, bunları bir işleme koyun. Yazma sorgusu her verildiğinde dosyaya yazmak (ve kilitlemek) yerine, yazma işlemi tamamlandığında yalnızca bir kez gerçekleşir.

İlk paragrafta yayınladığım bahsettiğim site SQLite'ye geri döndü ve birkaç yerde kodumu ayarladıktan sonra sorunsuz çalışıyor.

* site artık mevcut değil


3
MySQL'in "klasik" veritabanı motoru olan MyISAM, SQLite ile aynı anda okuma / yazma işlemleri ile aynı problemlere sahiptir. Aslında, yazma işleminde dokunduğu her satırı kilitleyerek yazma yoğun uygulamaları ölçeklendirmeyi imkansız hale getirir. Yine de, pek çok web uygulaması gayet iyi hizmet etti.
Henning

1
Cevabınızın başlangıcını yeniden yazabilir misiniz? DB'nin uygun dizinler olmadan performansını değerlendirmek tamamen haksızlıktır. Ayrıca işlemler SQLite'nin performansını ve ölçeklenebilirliğini çok değiştirir.
Kornel

3
@porneL: Doğru, ancak dizinsiz SQLite, dizinsiz MySQL'den daha yavaş bir büyüklük sırasıydı ve ikinci düzenlememdeki işlemler hakkında da biraz dahil ettim. Hala cevabın ilerlemesinin bir anlam ifade ettiğini düşünüyorum - SQLite'nin ilk naif kullanımını ve performansın ne kadar kötü olduğunu gösteriyor. Platformda yeni olanların benzer sorunlarla karşılaşmasını bekliyorum ve ilk paragrafla özdeşleşebileceklerini, daha sonra aşağıdaki düzenlemeleri okuyabileceklerini ve SQLite'ı kabul edilebilir bir performansa sahip olmanın hızlandırmanın yolları olduğunu umuyorum.
Kyle Cronin

1
Lütfen sitenizin saniyede kaç tıklama aldığını bizimle paylaşır mısınız?
NoobOverflow

2
Daha yeni SQLite sürümlerinde okuma / yazma döngülerinin bazı acılarını ortadan kaldırabilen ileri yazma günlüğü (WAL) de vardır. İşler değişir.
Lasse V. Karlsen

58

Sqlite tek kullanıcı açısından ölçeklenebilir, çok iyi performans gösteren çoklu gigabayt veritabanına sahibim ve onunla çok fazla sorunum olmadı.

Ama olan bu tür ölçekleme size bahsettiğini bağlıdır, böylece tek kullanıcı.

Yorumlara yanıt olarak. Not önler çok kullanıcılı bir ortamda bir SQLite veritabanı kullanarak hiçbir şeyin, ama her işlemin bir kilit alır (değiştirir veritabanı o aslında, her SQL deyimi) olduğu dosyadan veritabanına diğer kullanıcıların erişmesini engelleyecek, en hepsi .

Veritabanında çok fazla değişiklik yaptıysanız, ölçekleme sorunlarına çok hızlı bir şekilde ulaşacaksınız. Öte yandan, yazma erişimine kıyasla çok fazla okuma erişiminiz varsa, o kadar da kötü olmayabilir.

Ama SQLite ders olacak fonksiyonu çok kullanıcılı bir ortamda, ancak olmaz gerçekleştirmek de.


5
SQLite 3, diğer kullanıcılar yazarken okumayı destekler.
Alix Axel

2
Yukarıdaki yorumların güncel olmadığını, yeni (er) WAL sistemi ile yazma ve okumaların aynı anda gerçekleştirilebildiğini ve ölçeklenebilirliği artırdığını unutmayın.
Lasse V. Karlsen

Sql sunucusu veya oracle vb gibi herhangi bir rdbms anında sqlite kayıtları ihraç oluşturmak mümkün mü?
ILoveStackoverflow

29

SQLite sqlite.org web sitesini ve çok fazla trafiğe sahip olanları yönlendirir. Günde 100.000'den az isabete sahipseniz , SQLite'nin iyi çalışması gerektiğini önerirler . Bu da "Writeahead Logging" özelliğini yazmadan önce yazılmıştı.

SQLite ile işleri hızlandırmak istiyorsanız, aşağıdakileri yapın:

  • SQLite 3.7.x sürümüne yükseltme
  • Önden yazma günlüğünü etkinleştir
  • Şu pragmayı çalıştırın: "PRAGMA cache_size = Sayfa sayısı;" Varsayılan boyut (sayfa sayısı) 2000 sayfadır, ancak bu sayıyı yükseltirseniz, doğrudan bellekte çalışan veri miktarını yükseltirsiniz.

YouTube'da " İleri Yazma Günlüğü ile SQLite Performansını İyileştirme " adlı videoma bir göz atmak için önceden yazma günlüğünü nasıl kullanacağınızı ve yazma işlemleri için 5 kat daha hızlı bir gelişme gösterebilirsiniz .


24

Sqlite bir masaüstü veya işlem içi veritabanıdır. SQL Server, MySQL, Oracle ve kardeşleri sunuculardır .

Masaüstü veritabanları, doğası gereği veri deposuna eşzamanlı yazma erişimini desteklemesi gereken herhangi bir uygulama için iyi bir seçenek değildir . Bu, bir düzeyde, şimdiye kadar oluşturulan çoğu web sitesini içerir. Herhangi bir şey için giriş yapmanız gerekiyorsa, büyük olasılıkla DB'ye yazma erişiminiz olması gerekir.


5
'Bu, şimdiye kadar oluşturulmuş hemen hemen her web sitesini içerir' fikrine katılmıyorum. yorum Yap. Web sitesi yüksek yüklüyse haklısınız. Örneğin Trac varsayılan olarak SQLite kullanır ve küçük takımlar için çok iyi bir performans gösterir.
Andrew Burns

2
Zaman tanıyın: iki geliştiricinin aynı alana aynı anda erişmesini sağlar ve boğulur.
Joel Coehoorn

3
Boğucu olarak ne tanımlarsınız? Yanıtınızdan SQLite ile ilgili fazla deneyiminiz olmadığını tahmin ediyorum. SQLite, işlemlerde tüm dosyayı kilitler, böylece bir gecikme yaşayabilirsiniz, ancak önerdiğiniz durumda 'boğulma' neredeyse imkansızdır.
Andrew Burns

3
Andrew, SQL Lite küçük ekipler için iyi çalıştığı için ölçeklenebilir yapmaz, ölçeklenebilir olması için gereksinim ölçeklendirilebilir, yani büyük ekiplerle iyi performans göstermelidir. Bildiğim kadarıyla SQL Lite, oldukça düşük eşiği aşan büyük ekipler / eşzamanlı veritabanı işlemleri için ölçeklendirilemez.
Pop Catalin

5
@Adalet. Bu cevabın SQLite'ın ne kadar ölçeklenebilir olduğuna dair destekleyici bir kanıtı yoktur. Kimsenin cevabı çok daha iyi değil.
GateKiller

23

Bu SQLite belgelerini okudunuz mu - http://www.sqlite.org/whentouse.html ?

SQLite genellikle düşük ve orta trafikli web siteleri için veritabanı motoru olarak harika çalışır (yani, tüm web sitelerinin% 99,9'u). SQLite'nin işleyebileceği web trafiği miktarı, elbette, web sitesinin veritabanını ne kadar yoğun kullandığına bağlıdır. Genel olarak konuşursak, günde 100 bin isabetten az alan her site SQLite ile iyi çalışmalıdır. 100K isabet / gün rakamı, sabit bir üst sınır değil, muhafazakar bir tahmindir. SQLite'nin bu trafik miktarının 10 katıyla çalıştığı gösterilmiştir.


3
Bu konuda ÇOK çok katılıyorum. İsterseniz web sitelerinin% 99'u SQLLite ile iyi işlenebilir. Ancak, web trafiğinin% 99'u web sitelerinin en büyük% 1'ine gider.
djangofan

7
"100 bin isabet / gün" metriği tamamen çöptür. Bir "isabet" genellikle bir HTTP GET olarak tanımlanır ve bir grup dilimlenmiş görüntüye sahip bir web sayfası sayfa görüntüleme başına 40'tan fazla "isabet" alabilir - hiçbiri DB'ye dokunmaz. Dokümanlar hit == sayfa görüntüleme hatasını yapsa bile, yine de yanıltıcıdır. SQLite yazma sırasında tüm DB'yi kilitler. Sadece kayıtlara göz atan kişilerin 100 bin sayfa görüntüleme sunmasına rağmen, yoğun yazılan bir uygulamada (e-ticaret, mesaj panosu, vb.)
jamieb

10

SQLite ölçeklenebilirliği büyük ölçüde kullanılan verilere ve bunların biçimine bağlıdır. Ekstra uzun tablolar (GPS kayıtları, saniyede bir kayıt) ile bazı zor bir deneyim yaşadım. Deneyimler, SQLite'nin aşamalı olarak yavaşlayacağını gösterdi, kısmen endeksleri tutan büyüyen ikili ağaçların sürekli yeniden dengelenmesi nedeniyle (ve zaman damgalı endekslerle, ağacın çok yeniden dengeleneceğini biliyorsunuz , ancak aramalar). Sonuçta yaklaşık 1GB (çok ballpark, biliyorum), sorgular benim durumumda durgunlaşıyor. Kilometreniz değişecektir.

Hatırlamanız gereken bir şey, tüm övünmeye rağmen, SQLite veri ambarı için DEĞİLDİR. SQLite için tavsiye edilmeyen çeşitli kullanımlar vardır . SQLite'nin arkasındaki iyi insanlar bunu kendileri söylüyor:

SQLite'a bakmanın bir başka yolu şudur: SQLite, Oracle'ın yerini almak üzere tasarlanmamıştır. Fopen () yerine kullanılmak üzere tasarlanmıştır.

Ve bu, ana argümana (nicel değil, üzgünüm, ancak nitel değil) yol açar, SQLite tüm kullanımlar için değildir, oysa MySQL ideal olmasa bile birçok farklı kullanımı kapsayabilir. Örneğin, MySQL'in Firefox çerezlerini (SQLite yerine) depolamasını sağlayabilirsiniz, ancak bu hizmetin sürekli çalışması gerekir. Öte yandan, MySQL yerine SQLite (birçok kişi gibi) üzerinde çalışan işlemsel bir web siteniz olabilir, ancak çok fazla kesinti süresi bekleyebilirsiniz.


1
Verilerinizi parçalayarak, örneğin günde / haftada bir tablo gibi çok büyük dizinlenmiş tablolara sahip olma sorununu çözebilirsiniz. SQLite bile tabloları ayrı veritabanı dosyalarına bölmenize ve ardından ATTACH DATABASEtüm tablolarla sanal bir veritabanı bağlantısı oluşturmak için kullanmanıza izin verir (ancak 62 veritabanıyla sınırlıdır).
Alix Axel

3

Ben (sayı 1) bir web sunucusu istemcinin hunderts hizmet veritabanına tek bir bağlantı ile arka uç üzerinde göründüğünü düşünüyorum, değil mi?

Bu nedenle veritabanında eşzamanlı erişim yoktur ve bu nedenle veritabanının 'tek kullanıcı modunda' çalıştığını söyleyebiliriz. Böyle bir durumda çok kullanıcılı erişimi diskuss için bir anlam ifade etmez ve bu nedenle SQLite ve diğer sunucu tabanlı veritabanlarının yanı sıra çalışır.


1
Thx GateKiller, ancak lütfen "düşük hacimli web sitesi" belirtin.
Buz

3

Bu şekilde düşün. Birisi her kullandığında SQL Lite kilitlenecektir (SQLite okumaya kilitlenmez). Dolayısıyla, bir web sayfasını veya birden fazla eşzamanlı kullanıcısı olan bir uygulamayı sunuyorsanız, SQLLite ile aynı anda yalnızca bir uygulamanızı kullanabilirsiniz. Yani bir ölçeklendirme sorunu var. Onun bir kişi uygulaması yüzlerce başlık, derecelendirme, bilgi, kullanım, çalma, çalma süresi tutan bir Müzik Kütüphanesi söylüyorsa, SQL Lite milyonlarca kayıt olmasa bile binlerce güzel tutan ölçeklendirir (Sabit disk istekli)

MySQL ise her yerde insanların aynı anda kullanacağı sunucular uygulamaları için iyi çalışıyor. Kilitlenmez ve oldukça büyüktür. Müzik kitaplığınız için MySql, sadece bir kişinin göreceği gibi öldürülecekti, UNLESS, binlerce kişinin eklediği veya güncellediği paylaşılan bir müzik kütüphanesi. O zaman MYSQL kullanacaktı.

Teoride MySQL, Sqllite'den daha iyi ölçeklendirir, çünkü birden fazla kullanıcıyı işleyebilir, ancak tek bir kullanıcı uygulaması için aşırıya kaçar.


5
s / kullanır / yazar. sqlite okumaya kilitlenmiyor.
Gregg Lind

5
cevabınız kolayca yanlış yorumlanabilir. SQLite yalnızca yazma isteklerine kilitlenir . İlişkisel biçimde 50 GB'den fazla tıbbi veriyle SQLite için kullanıyoruz ve tarama ve sorgulama için yüzlerce eşzamanlı web istemcisine hizmet veriyoruz. Okuma performansı yakın zamanda MySQL'den daha kötü değildir.
Berk D. Demir

3
MySQL'in MyISAM, eşzamanlı erişim için SQLite'den daha iyi değildir. MySQL, tablo düzeyinde kilitleri çok kullanır ve MyISAM düzeninin en uygun olduğu birkaç durum dışında eşzamanlı yazma işlemleri yapmaz. InnoDB'yi (asla daralmayan datafile gibi kendi sorunları vardır) gitmedikçe, MySQL ile çok daha iyi olmayabilir.
Kornel

1

SQLite'nin web sitesi (başvuruda bulunduğunuz bölüm), bunun çeşitli çok kullanıcılı durumlar için kullanılabileceğini belirtir.

Biraz işleyebileceğini söyleyebilirim. Deneyimlerime göre her zaman çok hızlı oldu. Tabii ki, tablolarınızı endekslemeniz ve buna kod yazarken, parameritlenmiş sorgular ve benzeri kullandığınızdan emin olmanız gerekir. Temelde performansı artırmak için herhangi bir veritabanı ile aynı şeyler.


ve kullanım işlemleri. Bu SQLite için çok önemlidir.
Kornel

-1

SQLite üzerine kurulmuş bir veritabanı sunucusu olan REAL SQL Server'ı kontrol etmeye değer olabilir .


7
Çoğu site bile SQLLite sınırlarına ulaşmaya başlamak için yeterli trafik alamadım herhangi bir site "REAL SQL Server" için 299 $ harcama garanti etmez.
djangofan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.