2008-10-29 31 views
22

Tôi có nghi ngờ này, tôi đã tìm kiếm trên web và các câu trả lời dường như được đa dạng hóa. Sử dụng mysql_pconnect trên mysql_connect có tốt hơn khi kết nối với cơ sở dữ liệu thông qua PHP không? Tôi đọc rằng quy mô kết nối tốt hơn nhiều, nhưng mặt khác, là một kết nối liên tục ... có 10 000 kết nối cùng một lúc, tất cả liên tục, dường như không thể mở rộng với tôi.mysql_connect VS mysql_pconnect

Xin cảm ơn trước.

Trả lời

33

Kết nối liên tục không cần thiết đối với MySQL. Trong các cơ sở dữ liệu khác (như Oracle), việc tạo kết nối tốn kém và tốn thời gian, vì vậy nếu bạn có thể sử dụng lại kết nối thì đó là một chiến thắng lớn. Nhưng những thương hiệu của cơ sở dữ liệu cung cấp kết nối tổng hợp, mà giải quyết vấn đề một cách tốt hơn.

Tạo kết nối tới cơ sở dữ liệu MySQL nhanh chóng so với các nhãn hiệu khác, vì vậy việc sử dụng kết nối liên tục mang lại lợi ích ít hơn cho MySQL so với một thương hiệu cơ sở dữ liệu khác.

Kết nối liên tục cũng có nhược điểm. Máy chủ cơ sở dữ liệu phân bổ tài nguyên cho mỗi kết nối, cho dù các kết nối có cần thiết hay không. Vì vậy, bạn thấy rất nhiều tài nguyên lãng phí không có mục đích nếu các kết nối không hoạt động. Tôi không biết nếu bạn sẽ đạt đến 10.000 kết nối nhàn rỗi, nhưng ngay cả một vài trăm là tốn kém.

Các kết nối có trạng thái và sẽ không phù hợp với yêu cầu PHP để "kế thừa" thông tin từ một phiên trước đó được sử dụng bởi một yêu cầu PHP khác. Ví dụ, các bảng tạm thời và biến người dùng thường được dọn sạch khi kết nối đóng, nhưng không phải nếu bạn sử dụng các kết nối liên tục. Các cài đặt dựa trên phiên tương tự như tập ký tự và đối chiếu. Ngoài ra, LAST_INSERT_ID() sẽ báo cáo id được tạo lần cuối trong phiên - ngay cả khi đó là trong yêu cầu PHP trước đó.

Đối với MySQL ít nhất, nhược điểm của các kết nối liên tục có thể lớn hơn lợi ích của chúng. Và có những kỹ thuật khác, tốt hơn để đạt được khả năng mở rộng cao.


Cập nhật Tháng 3 năm 2014:

tốc độ kết nối MySQL luôn thấp so với các nhãn hiệu khác của RDBMS, nhưng nó nhận được thậm chí tốt hơn.

Xem http://mysqlserverteam.com/improving-connectdisconnect-performance/

Trong MySQL 5.6, chúng tôi bắt đầu làm việc tối ưu hóa xử lý kết nối và ngắt kết nối mã. Và công việc này đã tăng tốc trong MySQL 5.7. Trong bài đăng trên blog này, trước tiên tôi sẽ hiển thị các kết quả chúng tôi đã đạt được và sau đó mô tả những gì chúng tôi đã làm để có được chúng.

Đọc blog để biết thêm chi tiết và so sánh tốc độ.

3

Rất khó có thể đạt tới 10000 kết nối. Nhưng dù sao đi nữa, hãy đến số official source. (Mỏ nhấn mạnh).

Nếu kết nối liên tục không có bất kỳ chức năng nào được thêm, thì là gì?

Câu trả lời ở đây cực kỳ đơn giản - hiệu quả. Các kết nối liên tục là tốt nếu phí trên không tạo liên kết cho máy chủ SQL của bạn cao. Cho dù hoặc không phải chi phí thực sự cao này là phụ thuộc vào nhiều yếu tố. Giống như, loại cơ sở dữ liệu là gì, cho dù hoặc không phải là nó nằm trên cùng một máy tính trên mà máy chủ web của bạn ngồi, cách tải máy chủ SQL ngồi vào và vv. Dòng dưới cùng là nếu chi phí kết nối đó là kết nối cao, liên tục giúp bạn đáng kể. Chúng gây ra quá trình cho trẻ em chỉ cần kết nối chỉ một lần cho toàn bộ vòng đời của nó, thay vì mỗi lần xử lý trang yêu cầu kết nối với máy chủ SQL. Điều này có nghĩa là đối với mọi trẻ em, mở kết nối liên tục sẽ có kết nối liên tục mở của riêng bạn với máy chủ. Ví dụ: nếu bạn có 20 con khác nhau quy trình chạy tập lệnh được thực hiện kết nối liên tục với máy chủ SQL , bạn có 20 kết nối khác nhau cho máy chủ SQL, một từ mỗi trẻ.

Lưu ý, tuy nhiên, điều này có thể có một số nhược điểm nếu bạn đang sử dụng một cơ sở dữ liệu với giới hạn kết nối được vượt con dai dẳng kết nối. Nếu cơ sở dữ liệu của bạn có giới hạn của 16 kết nối đồng thời, và trong quá trình máy chủ bận phiên, 17 chủ đề con cố gắng để kết nối, một người sẽ không thể. Nếu có lỗi trong tập lệnh của bạn mà không cho phép các kết nối tắt xuống (chẳng hạn như vòng lặp vô hạn), cơ sở dữ liệu chỉ với 16 kết nối có thể được nhanh chóng bị đầm lầy. Kiểm tra tài liệu cơ sở dữ liệu của bạn để biết thông tin về xử lý các kết nối bị bỏ rơi hoặc nhàn rỗi .

4

Về cơ bản, bạn phải cân bằng chi phí tạo kết nối so với giữ kết nối. Mặc dù MySQL rất nhanh trong việc thiết lập một kết nối mới, nhưng nó vẫn có chi phí - trong thời gian thiết lập luồng và trong thời gian thiết lập TCP/IP từ máy chủ web của bạn. Điều này đáng chú ý trên trang web có lưu lượng truy cập đủ cao. Thật không may, PHP không có bất kỳ điều khiển nào về sự tồn tại của các kết nối. Vì vậy, câu trả lời là để giảm thời gian chờ nhàn rỗi trong MySQL một cách lâu dài (như xuống đến 20 giây), và để lên kích thước bộ nhớ cache thread. Cùng nhau, điều này thường hoạt động khá tốt.

Mặt khác, ứng dụng của bạn cần phải tôn trọng trạng thái kết nối. Nếu bạn sử dụng các bảng tạm thời, thì sử dụng CREATE IF NOT EXISTS và TRUNCATE TABLE sẽ giúp ích rất nhiều, cũng như đặt tên chúng là duy nhất (chẳng hạn như bao gồm cả userid). Các giao dịch có vấn đề hơn một chút; nhưng mã của bạn luôn có thể làm ROLLBACK ở trên cùng, chỉ trong trường hợp.

+0

Trong nhiều phiên bản gần đây của PHP so với khi tôi đã viết bài trả lời này, tôi đã phát hiện ra rằng hiện nay có các thiết lập để điều chỉnh kích thước hồ bơi. Đặc biệt, 5.4.0 có tùy chọn 'mysqli.max_persistent' là kích thước tối đa của nhóm kết nối trong trường hợp đó của PHP. Vẫn không có một giá trị trong PHP để định thời gian kết nối. – staticsan

3

mysql_connect()mysql_pconnect() cả hai đều đang hoạt động để kết nối cơ sở dữ liệu nhưng có ít sự khác biệt. Trong mysql_pconnect(), p là viết tắt của kết nối liên tục.

Khi chúng tôi đang sử dụng chức năng mysql_connect(), mỗi lần mở và đóng kết nối cơ sở dữ liệu, tùy thuộc vào yêu cầu.

Nhưng trong trường hợp của mysql_pconnect() chức năng:

  • Thứ nhất, khi kết nối, chức năng sẽ cố gắng tìm một (kéo dài) kết nối đó là đã được mở với cùng một máy chủ, tên đăng nhập và mật khẩu. Nếu được tìm thấy, một số nhận dạng cho nó sẽ được trả lại thay vì mở một kết nối mới.

  • Thứ hai, kết nối với máy chủ SQL sẽ không bị đóng khi thực thi tập lệnh kết thúc. Thay vào đó, kết nối sẽ vẫn mở để sử dụng trong tương lai (mysql_close() sẽ không đóng kết nối được thiết lập bởi mysql_pconnect()).

mysql_pconncet() hữu ích khi bạn có rất nhiều traffice trên trang web của mình. Tại thời điểm đó cho mọi yêu cầu, nó sẽ không mở một kết nối nhưng sẽ lấy nó từ hồ bơi. Điều này sẽ làm tăng hiệu quả của trang web của bạn. Nhưng để sử dụng chung mysql_connect() là tốt nhất.

+0

mysql_pconnect() là tốt hơn để sử dụng với mysqlnd? ", chức năng sẽ cố gắng tìm một kết nối (liên tục) đã mở với cùng một máy chủ, tên người dùng và mật khẩu." - Tôi nghĩ rằng điều này làm việc tốt hơn với mysqlnd hoặc tôi sai? – consigliere

0

mysql_connect()

1.mysql_connect thể được sử dụng để đóng thời gian connection.Every nó được mở và đóng kết nối cơ sở dữ liệu, tùy theo yêu cầu.

cơ sở dữ liệu 2.Here được mở mỗi khi trang web được tải trong MYSQL kết nối

3. Khi trang web được tải, cơ sở dữ liệu được nạp mọi

4.It được sử dụng để đóng kết nối

Ví dụ:

<?php $conn = mysql_connect(‘host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?> 

Mô tả:

host: Chỉ định tên máy chủ hoặc địa chỉ IP như localhost.

mysql_user: Chỉ định tên người dùng MySQL

mysql_password: Chỉ định mật khẩu MySQL

mysql_pconnect()

1.We sử dụng mysql_pconncet(), nó ban đầu cố gắng tìm một mở dai dẳng kết nối.

2.The mysql_pconncet() mở kết nối persistant

3.The mysql_pconnect() không hỗ trợ kết nối chặt chẽ

4.mysql_pconnect() không thể đóng kết nối. Ở đây mở kết nối liên tục đến cơ sở dữ liệu

5.Không cần kết nối cơ sở dữ liệu mọi lúc.

6. Cơ sở dữ liệu không cần phải được kết nối mỗi lần trong mysql_pconncet().

hơn

chi tiết: http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

Các vấn đề liên quan