Làm thế nào khả năng mở rộng là SQLite? [đóng cửa]


178

Gần đây tôi đã đọc Câu hỏi này về SQLite và MySQL và câu trả lời đã chỉ ra rằng SQLite không có quy mô tốt và loại trang web chính thức xác nhận điều này , tuy nhiên.

SQLite có khả năng mở rộng như thế nào và giới hạn trên của nó là gì?

Câu trả lời:


429

Hôm qua tôi đã phát hành một trang web nhỏ *để theo dõi đại diện của bạn đã sử dụng cơ sở dữ liệu SQLite được chia sẻ cho tất cả khách truy cập. Thật không may, ngay cả với tải trọng khiêm tốn mà nó đặt lên máy chủ của tôi, nó vẫn chạy khá chậm. Điều này là do toàn bộ cơ sở dữ liệu đã bị khóa mỗi khi ai đó xem trang vì nó chứa các cập nhật / chèn. Tôi sớm chuyển sang MySQL và trong khi tôi không có nhiều thời gian để thử nghiệm nó, nó dường như có khả năng mở rộng hơn nhiều so với SQLite. Tôi chỉ nhớ tải trang chậm và thỉnh thoảng gặp lỗi khóa cơ sở dữ liệu khi cố gắng thực hiện các truy vấn từ shell trong sqlite. Điều đó nói rằng, tôi đang chạy một trang web khác từ SQLite. Sự khác biệt là trang web là tĩnh (tức là tôi là người duy nhất có thể thay đổi cơ sở dữ liệu) và do đó nó hoạt động tốt khi đọc đồng thời. Đạo đức của câu chuyện:

chỉnh sửa : Tôi chỉ nhận ra rằng tôi có thể không công bằng với SQLite - Tôi đã không lập chỉ mục bất kỳ cột nào trong cơ sở dữ liệu SQLite khi tôi đang phục vụ nó từ một trang web. Điều này một phần gây ra sự chậm lại mà tôi đang trải qua. Tuy nhiên, việc quan sát các giá trị khóa cơ sở dữ liệu - nếu bạn có các cập nhật đặc biệt khó chịu, hiệu suất SQLite sẽ không khớp với MySQL hoặc Postgres.

một chỉnh sửa khác: Kể từ khi tôi đăng bài này gần 3 tháng trước, tôi đã có cơ hội kiểm tra chặt chẽ khả năng mở rộng của SQLite và với một vài thủ thuật, nó có thể mở rộng được. Như tôi đã đề cập trong lần chỉnh sửa đầu tiên của mình, các chỉ mục cơ sở dữ liệu giảm đáng kể thời gian truy vấn, nhưng đây là một quan sát chung về cơ sở dữ liệu hơn là về SQLite. Tuy nhiên, có một mẹo khác bạn có thể sử dụng để tăng tốc SQLite: giao dịch . Bất cứ khi nào bạn phải viết nhiều cơ sở dữ liệu, hãy đặt chúng vào trong một giao dịch. Thay vì ghi vào (và khóa) tệp mỗi lần truy vấn ghi, việc ghi sẽ chỉ xảy ra một lần khi giao dịch hoàn tất.

Trang web mà tôi đề cập tôi đã phát hành trong đoạn đầu tiên đã được chuyển lại thành SQLite và nó hoạt động khá trơn tru khi tôi điều chỉnh mã của mình ở một vài nơi.

* trang web không còn khả dụng


3
Công cụ cơ sở dữ liệu "cổ điển" của MySQL, MyISAM, có cùng các vấn đề liên quan đến các hoạt động đọc / ghi đồng thời như SQLite. Trong thực tế, nó khóa mọi hàng đơn lẻ mà nó chạm vào trong một thao tác ghi, khiến nó không thể mở rộng các ứng dụng chuyên sâu về ghi. Tuy nhiên, nó vẫn phục vụ nhiều ứng dụng web tốt.
Henning

1
Bạn có thể viết lại bắt đầu câu trả lời của bạn sau đó? Đánh giá hiệu suất của DB mà không có chỉ số phù hợp là hoàn toàn không công bằng. Ngoài ra các giao dịch thay đổi hiệu suất và khả năng mở rộng của SQLite rất nhiều.
Kornel

3
@yheL: Đúng, nhưng SQLite không có chỉ mục là một thứ tự cường độ chậm hơn so với MySQL không có chỉ mục và tôi cũng bao gồm một chút về các giao dịch trong lần chỉnh sửa thứ hai của mình. Tôi vẫn nghĩ rằng sự tiến triển của câu trả lời có ý nghĩa nào đó - nó cho thấy việc sử dụng SQLite ngây thơ ban đầu của tôi và hiệu suất tương đối tệ như thế nào. Tôi hy vọng rằng những người mới sử dụng nền tảng sẽ gặp phải các vấn đề tương tự và tôi hy vọng rằng họ có thể xác định được với đoạn đầu tiên, sau đó đọc các chỉnh sửa sau và nhận ra rằng có nhiều cách để tăng tốc SQLite để có hiệu suất chấp nhận được.
Kyle Cronin

1
Bạn có thể vui lòng chia sẻ với chúng tôi khoảng bao nhiêu lượt truy cập mỗi giây mà trang web của bạn nhận được không?
NoobOverflow

2
Ngoài ra còn có ghi nhật ký ghi trước (WAL) có sẵn trong các phiên bản SQLite mới hơn có thể làm mất đi một số nỗi đau của chu trình đọc / ghi. Nhiều thứ thay đổi.
Lasse V. Karlsen

58

Sqlite có khả năng mở rộng về mặt người dùng đơn lẻ, tôi có cơ sở dữ liệu nhiều gigabyte hoạt động rất tốt và tôi không gặp nhiều vấn đề với nó.

Nhưng nó người dùng đơn lẻ, vì vậy nó phụ thuộc vào loại tỷ lệ bạn đang nói đến.

Đáp lại những bình luận. Lưu ý rằng không có gì ngăn cản sử dụng cơ sở dữ liệu Sqlite trong môi trường nhiều người dùng, nhưng mọi giao dịch (thực tế, mọi câu lệnh SQL sửa đổi cơ sở dữ liệu) đều khóa trên tệp , điều này sẽ ngăn người dùng khác truy cập vào cơ sở dữ liệu tại tất cả .

Vì vậy, nếu bạn có rất nhiều sửa đổi được thực hiện cho cơ sở dữ liệu, về cơ bản bạn sẽ gặp vấn đề mở rộng rất nhanh. Mặt khác, nếu bạn có nhiều quyền truy cập đọc so với quyền truy cập ghi, thì nó có thể không quá tệ.

Nhưng Sqlite tất nhiên sẽ hoạt động trong môi trường nhiều người dùng, nhưng nó sẽ không hoạt động tốt.


5
SQLite 3 hỗ trợ đọc khi người dùng khác viết thư cho nó.
Alix Axel

2
Lưu ý rằng các nhận xét trên đã lỗi thời, với hệ thống WAL (er) mới, việc ghi và đọc có thể được thực hiện cùng một lúc, tăng khả năng mở rộng.
Lasse V. Karlsen

Có thể tạo để xuất các bản ghi khi đang bay sang sqlite từ bất kỳ rdbms nào như máy chủ sql hoặc oracle vv?
ILoveStackoverflow 16/2/18

29

SQLite điều khiển trang web sqlite.org và các trang web khác có nhiều lưu lượng truy cập. Họ đề nghị rằng nếu bạn có ít hơn 100 nghìn lượt truy cập mỗi ngày, SQLite sẽ hoạt động tốt. Và điều đó đã được viết trước khi họ cung cấp tính năng "Ghi nhật ký Writeahead".

Nếu bạn muốn tăng tốc mọi thứ với SQLite, hãy làm như sau:

  • nâng cấp lên SQLite 3.7.x
  • Cho phép ghi nhật ký trước
  • Chạy pragma sau: "PRAGMA cache_size = Số trang;" Kích thước mặc định (Số trang) là 2000 trang, nhưng nếu bạn tăng số đó, thì bạn sẽ tăng lượng dữ liệu đang chạy thẳng ra khỏi bộ nhớ.

Bạn có thể muốn xem video của tôi trên YouTube có tên " Cải thiện hiệu suất SQLite với ghi nhật ký Writeahead " cho biết cách sử dụng ghi nhật ký viết trước và thể hiện sự cải thiện tốc độ 5x để ghi.


24

Sqlite là một máy tính để bàn hoặc cơ sở dữ liệu trong quá trình . SQL Server, MySQL, Oracle và anh em của họ là máy chủ .

Cơ sở dữ liệu máy tính để bàn về bản chất không phải là một lựa chọn tốt cho bất kỳ ứng dụng nào cần hỗ trợ truy cập ghi đồng thời vào kho lưu trữ dữ liệu. Điều này bao gồm ở một số cấp độ hầu hết các trang web từng được tạo ra. Nếu bạn thậm chí phải đăng nhập bất cứ thứ gì, có lẽ bạn cần quyền truy cập ghi vào DB.


5
Tôi sẽ không đồng ý với 'Điều này bao gồm khá nhiều trang web từng được tạo.' bình luận. Nếu trang web tải cao, bạn là chính xác. Ví dụ, Trac sử dụng SQLite theo mặc định và thực hiện rất độc đáo cho các nhóm nhỏ.
Andrew Burns

2
Hãy cho nó thời gian: bạn sẽ có hai nhà phát triển truy cập vào cùng một lĩnh vực cùng một lúc và nó sẽ bị nghẹt thở.
Joel Coehoorn

3
Bạn định nghĩa thế nào là sặc? từ phản hồi của bạn, tôi đoán bạn không có nhiều kinh nghiệm với SQLite. SQLite sẽ khóa toàn bộ tệp trên các hoạt động để bạn có thể gặp phải sự chậm trễ, nhưng gần như không thể có nó 'nghẹt thở' trong tình huống bạn đề xuất.
Andrew Burns

3
Andrew, vì SQL Lite hoạt động tốt cho các nhóm nhỏ, không làm cho nó có thể mở rộng được, để có thể mở rộng, yêu cầu rất tốt đối với quy mô, có nghĩa là nó sẽ hoạt động tốt với các nhóm lớn. Theo hiểu biết của tôi, SQL Lite không thể mở rộng cho các nhóm lớn / hoạt động cơ sở dữ liệu đồng thời vượt quá ngưỡng khá thấp.
Pop Catalin

5
@Sự công bằng. Câu trả lời này không có bằng chứng hỗ trợ về mức độ mở rộng của SQLite. Câu trả lời của không ai tốt hơn nhiều.
GateKiller

23

Bạn đã đọc tài liệu SQLite này - http://www.sqlite.org/weaverouse.html chưa?

SQLite thường sẽ hoạt động tốt như công cụ cơ sở dữ liệu cho các trang web lưu lượng truy cập thấp đến trung bình (có nghĩa là, 99,9% của tất cả các trang web). Tất nhiên, lượng lưu lượng truy cập web mà SQLite có thể xử lý phụ thuộc vào mức độ trang web sử dụng cơ sở dữ liệu của nó. Nói chung, bất kỳ trang web nào nhận được ít hơn 100 nghìn lượt truy cập / ngày sẽ hoạt động tốt với SQLite. Con số 100 nghìn lượt truy cập / ngày là một ước tính bảo thủ, không phải là giới hạn trên cứng. SQLite đã được chứng minh là hoạt động với lượng lưu lượng gấp 10 lần.


3
Tôi đồng ý RẤT nhiều với điều này. 99% trang web có thể được xử lý tốt với SQLLite nếu bạn muốn. Tuy nhiên, 99% lưu lượng truy cập web đi đến 1% lớn nhất của các trang web, mặt khác.
djangofan

7
Số liệu của "100k lượt truy cập / ngày" là rác hoàn toàn. "Lượt truy cập" thường được định nghĩa là HTTP GET và một trang web có một loạt các hình ảnh được cắt lát có thể nhận được hơn 40 "lần truy cập" trên mỗi lần xem trang - không ai trong số đó chạm vào DB. Ngay cả khi các tài liệu đang mắc lỗi hit == số lần xem trang, nó vẫn gây hiểu nhầm. SQLite khóa toàn bộ DB trên một ghi. Mặc dù nó có thể phục vụ mạnh mẽ 100 nghìn lượt xem trang của những người chỉ duyệt hồ sơ, nhưng nó sẽ bị phá vỡ trong một ứng dụng chuyên sâu viết (thương mại điện tử, bảng tin, v.v.).
jamieb

10

Khả năng mở rộng SQLite sẽ phụ thuộc nhiều vào dữ liệu được sử dụng và định dạng của chúng. Tôi đã có một số kinh nghiệm khó khăn với các bảng dài thêm (bản ghi GPS, một bản ghi mỗi giây). Kinh nghiệm cho thấy SQLite sẽ chậm lại theo từng giai đoạn, một phần do việc tái cân bằng liên tục các cây nhị phân đang phát triển đang giữ các chỉ mục (và với các chỉ mục được đóng dấu thời gian, bạn chỉ biết rằng cây sẽ được cân bằng lại rất nhiều, nhưng nó rất quan trọng đối với bạn tìm kiếm). Vì vậy, cuối cùng ở mức khoảng 1GB (rất là sân bóng, tôi biết), các truy vấn trở nên chậm chạp trong trường hợp của tôi. Số dặm của bạn sẽ thay đổi.

Một điều cần nhớ, mặc dù tất cả sự khoe khoang, SQLite KHÔNG được tạo ra để lưu trữ dữ liệu. Có nhiều cách sử dụng khác nhau không được khuyến nghị cho SQLite. Những người tốt đằng sau SQLite tự nói điều đó:

Một cách khác để xem SQLite là thế này: SQLite không được thiết kế để thay thế Oracle. Nó được thiết kế để thay thế fopen ().

Và điều này dẫn đến đối số chính (không phải định lượng, xin lỗi, nhưng định tính), SQLite không dành cho tất cả các mục đích sử dụng, trong khi MySQL có thể bao gồm nhiều cách sử dụng khác nhau, ngay cả khi không lý tưởng. Ví dụ: bạn có thể có MySQL lưu trữ cookie Firefox (thay vì SQLite), nhưng bạn cần dịch vụ đó chạy mọi lúc. Mặt khác, bạn có thể có một trang web giao dịch chạy trên SQLite (như nhiều người làm) thay vì MySQL, nhưng mong đợi rất nhiều thời gian chết.


1
Bạn có thể giải quyết vấn đề có các bảng được lập chỉ mục rất lớn bằng cách bảo vệ dữ liệu của bạn, ví dụ: một bảng mỗi ngày / tuần. SQLite thậm chí cho phép bạn chia các bảng thành các tệp cơ sở dữ liệu riêng biệt và sau đó sử dụng ATTACH DATABASEđể tạo kết nối cơ sở dữ liệu ảo với tất cả các bảng (tuy nhiên giới hạn ở 62 cơ sở dữ liệu).
Alix Axel

3

Tôi nghĩ rằng một máy chủ web (trong số 1) phục vụ hàng loạt khách hàng xuất hiện trên phần phụ trợ với một kết nối duy nhất đến cơ sở dữ liệu, phải không?

Vì vậy, không có quyền truy cập đồng thời trong cơ sở dữ liệu do đó chúng ta có thể nói rằng cơ sở dữ liệu đang hoạt động ở 'chế độ người dùng đơn lẻ'. Thật vô nghĩa khi truy cập nhiều người dùng trong trường hợp như vậy và SQLite hoạt động tốt như bất kỳ cơ sở dữ liệu dựa trên máy chủ nào khác.


1
Thx GateKiller, nhưng vui lòng chỉ định "trang web khối lượng thấp".
Băng

3

Nghĩ theo cách này. SQL Lite sẽ bị khóa mỗi khi ai đó sử dụng nó (SQLite không khóa khi đọc). Vì vậy, nếu bạn phục vụ một trang web hoặc một ứng dụng có nhiều người dùng đồng thời thì chỉ có một người có thể sử dụng ứng dụng của bạn tại một thời điểm với SQLLite. Vì vậy, có một vấn đề mở rộng. Nếu ứng dụng một người nói là Thư viện nhạc nơi bạn giữ hàng trăm danh hiệu, xếp hạng, thông tin, sử dụng, chơi, thời gian chơi thì SQL Lite sẽ có quy mô đẹp mắt, giữ hàng ngàn bản ghi (không có ổ cứng)

Mặt khác, MySQL hoạt động tốt cho các ứng dụng máy chủ nơi mọi người sẽ sử dụng đồng thời. Nó không khóa và nó có kích thước khá lớn. Vì vậy, đối với thư viện nhạc của bạn, MySql sẽ bị giết vì chỉ có một người nhìn thấy nó, KHÔNG GIỚI HẠN đây là thư viện nhạc được chia sẻ nơi hàng ngàn người thêm hoặc cập nhật nó. Sau đó, MYSQL sẽ là người sử dụng.

Vì vậy, về mặt lý thuyết, quy mô của MySQL tốt hơn Sqllite vì nó có thể xử lý người dùng đa dạng, nhưng lại quá mức cần thiết cho một ứng dụng người dùng.


5
s / sử dụng nó / ghi vào nó. sqlite không khóa đọc.
Gregg Lind

5
tốt, câu trả lời của bạn có thể bị hiểu sai một cách dễ dàng. SQLite chỉ khóa trên các yêu cầu ghi . Chúng tôi đang sử dụng SQLite với hơn 50 GB dữ liệu y tế ở dạng quan hệ và phục vụ hàng trăm khách hàng web đồng thời để duyệt và truy vấn. Hiệu suất đọc của nó không bao giờ tệ hơn một MySQL gần đây.
Berk D. Demir

3
MyISAM của MySQL không tốt hơn nhiều cho việc truy cập đồng thời so với SQLite. MySQL sử dụng khóa cấp bảng rất nhiều và sẽ không ghi đồng thời trừ một số trường hợp bố cục của MyISAM là tối ưu. Trừ khi bạn dùng InnoDB (có vấn đề riêng như datafile không bao giờ thu hẹp), bạn có thể không tốt hơn nhiều với MySQL.
Kornel

1

Trang web của SQLite (phần mà bạn đã tham chiếu) chỉ ra rằng nó có thể được sử dụng cho nhiều tình huống đa người dùng.

Tôi sẽ nói rằng nó có thể xử lý khá một chút. Theo kinh nghiệm của tôi, nó luôn luôn rất nhanh. Tất nhiên, bạn cần lập chỉ mục các bảng của mình và khi mã hóa theo bảng, bạn cần đảm bảo rằng bạn sử dụng các truy vấn tối ưu hóa và tương tự. Về cơ bản cùng một thứ bạn sẽ làm với bất kỳ cơ sở dữ liệu nào để cải thiện hiệu suất.


và sử dụng các giao dịch. Điều đó rất quan trọng đối với SQLite.
Kornel

-1

Có thể đáng để kiểm tra REAL SQL Server , một máy chủ cơ sở dữ liệu được xây dựng trên SQLite.


7
Tôi không nghĩ bất kỳ trang web nào đảm bảo chi $ 299 cho "Máy chủ SQL THỰC SỰ" khi hầu hết các trang web không có đủ lưu lượng truy cập để thậm chí bắt đầu đạt đến giới hạn của SQLLite.
djangofan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.