2013-09-24 39 views
7

Tôi có một thiết kế cơ sở dữ liệu ở đây trông này trong phiên bản đơn giản:PHP/MySQL: Truy vấn SQL lớn hoặc một số truy vấn nhỏ hơn?

Bảng building:

  • id
  • attribute1
  • attribute2

dữ liệu trong đó cũng giống như:

  • (1, 1, 1)
  • (2, 1, 2)
  • (3, 5, 4)

Và các bảng, attribute1_valuesattribute2_values, cấu trúc như:

  • id
  • giá trị

nào chứa thông tin như:

  • (1, "mô tả nguyên bản của phương án 1")
  • (2, "mô tả nguyên bản của phương án 2")
  • ...
  • (6, "mô tả nguyên bản của tùy chọn 6")

Tôi không chắc liệu đây có phải là thiết lập tốt nhất hay không, nhưng được thực hiện theo yêu cầu của người quản lý dự án của tôi. Nó chắc chắn có một số sự thật trong nó như bạn có thể sửa đổi các văn bản một cách dễ dàng ngay bây giờ mà không làm rối tung id của.

Tuy nhiên bây giờ tôi đã đến một trang mà tôi cần liệt kê các thuộc tính, vậy làm thế nào để tôi đi về đó? Tôi thấy hai tùy chọn chính:

1) Thực hiện một truy vấn lớn tập hợp tất cả các giá trị từ building và đồng thời chọn biểu diễn văn bản chính xác từ bảng attribute{x}_values.

2) Thực hiện truy vấn nhỏ tập hợp tất cả các giá trị từ bảng building. Sau đó, sau đó nhận được các đại diện văn bản của từng thuộc tính một tại một thời điểm.

Tùy chọn tốt nhất để chọn là gì? Có phải tùy chọn 1 thậm chí còn nhanh hơn tùy chọn 2 không? Nếu vậy, liệu nó có đáng giá thêm rắc rối liên quan đến bảo trì?

+6

Một truy vấn cơ sở dữ liệu đơn thường là rất nhiều hiệu quả hơn nhiều truy vấn, và nên được ít mã như cũng –

+0

@MarkBaker Có có thể lên đến 20 thuộc tính mặc dù ... Bất kỳ lý do gì để có một quan điểm khác nhau sau đó? – skiwi

+0

Càng nhiều thuộc tính, càng có nhiều lý do để sử dụng một truy vấn thay vì 20 truy vấn riêng lẻ - chi phí thời gian để thực hiện truy vấn cao hơn rất nhiều so với chi phí thời gian để lặp qua kết quả, do đó, 20 truy vấn mà mỗi kết quả trả về 1 gần như chắc chắn chậm hơn rất nhiều so với 1 truy vấn trả về 20 kết quả –

Trả lời

-1

Không bao giờ thực hiện một truy vấn tại một thời điểm, hãy thử kết hợp chúng thành một truy vấn đơn lẻ.

MySQL sẽ lưu truy vấn của bạn và nó sẽ chạy nhanh hơn nhiều. Vòng lặp PhP nhanh hơn thực hiện nhiều yêu cầu tới cơ sở dữ liệu.

Bộ đệm truy vấn lưu trữ văn bản của câu lệnh SELECT cùng với kết quả tương ứng đã được gửi tới máy khách. Nếu sau đó nhận được một câu lệnh giống hệt nhau, máy chủ sẽ truy xuất các kết quả từ bộ đệm truy vấn thay vì phân tích cú pháp và thực hiện lại câu lệnh.

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

0

Nếu bạn có một số lượng nhỏ các hàng trong bảng thuộc tính, sau đó tôi đề nghị để lấy chúng đầu tiên, lấy tất cả trong số họ! lưu trữ chúng vào một số mảng bằng cách sử dụng id làm khóa chỉ mục trong mảng.

Sau đó, bạn có thể tiến hành với dữ liệu xây dựng, bây giờ bạn chỉ cần sử dụng mảng tương ứng để tìm kiếm giá trị thuộc tính

0

Tôi muốn giới thiệu một cái gì đó ở giữa. Phân tích kết quả từ bảng đầu tiên trong php và tìm ra số thuộc tính bạn cần phải chọn từ mỗi bảng thuộc tính [x] _values.

Sau đó, bạn có thể chọn hàng loạt thuộc tính bằng một truy vấn trên mỗi bảng, thay vì một truy vấn cho mỗi thuộc tính hoặc một truy vấn cho mỗi tòa nhà.

1

Một đề xuất khác là tạo chế độ xem trên máy chủ chỉ với dữ liệu bạn cần và truy vấn từ đó. Điều đó sẽ giữ cho công việc trên máy chủ kết thúc, và bạn có thể kéo chỉ những gì bạn cần mỗi lần.

+0

Làm thế nào để làm cho một khung nhìn khác với việc viết tất cả trong 1 truy vấn từ một quan điểm hiệu quả? –

+0

Thu thập dữ liệu vào một dạng xem và sau đó truy vấn ra khỏi đó để bạn không thấy mình viết các truy vấn dài đầy tham gia mỗi lần bạn cần phải kéo dữ liệu. Đó là mã hiệu quả hơn bất cứ thứ gì. Nó cũng cung cấp cho anh ta một cách hiển thị nhiều hơn để xem dữ liệu trong cơ sở dữ liệu vì nó nằm trong nhiều bảng. Tôi thực sự không thể tưởng tượng được tại sao bạn không muốn một cái nhìn, trừ khi bạn có một yếu tố trong tâm trí mà tôi không xem xét. – dsimer

0

Dưới đây là một giải pháp PHP:

$query = "SELECT * FROM building"; 
$result = mysqli_query(connection,$query); 
$query = "SELECT * FROM attribute1_values"; 
$result2 = mysqli_query(connection,$query); 
$query = "SELECT * FROM attribute2_values"; 
$result3 = mysqli_query(connection,$query); 
$n = mysqli_num_rows($result); 
for($i = 1; $n <= $i; $i++) { 
    $row = mysqli_fetch_array($result); 
    mysqli_data_seek($result2,$row['attribute1']-1); 
    $row2 = mysqli_fetch_array($result2); 
    $row2['value'] //Use this as the value for attribute one of this object. 
    mysqli_data_seek($result3,$row['attribute2']-1); 
    $row3 = mysqli_fetch_array($result3); 
    $row3['value'] //Use this as the value for attribute one of this object. 
} 

Hãy ghi nhớ rằng giải pháp này đòi hỏi rằng các bảng attribute1_values ​​và attribute2_values ​​bắt đầu từ 1 và tăng 1 mỗi hàng duy nhất.

0

Oracle/Postgres/MySql DBA ở đây:

Chạy một truy vấn nhiều lần có khá nhiều chi phí. Có nhiều chuyến đi vòng đến db, và nếu nó trên một máy chủ từ xa, điều này có thể tăng lên. DB có thể sẽ phải phân tích cùng một truy vấn nhiều lần trong MySql, điều này sẽ vô cùng hiệu quả nếu có hàng tấn. Bây giờ, một điều mà phương thức PHP của bạn (nhiều truy vấn) có lợi thế là nó sẽ sử dụng ít bộ nhớ hơn vì nó sẽ giải phóng kết quả khi chúng không còn cần thiết nữa (nếu bạn chạy truy vấn dưới dạng vòng lặp lồng nhau) , nhưng nếu bạn truy vấn tất cả các kết quả ở phía trước, bạn sẽ có rất nhiều bộ nhớ, tùy thuộc vào kích thước bảng).

Kết quả tối ưu là chạy truy vấn dưới dạng 1 truy vấn và hiển thị từng kết quả khi cần và loại bỏ nó, có thể làm hỏng khung MVC trừ khi bạn đang chạy mã mô hình thoải mái trong chế độ xem của bạn hoặc chạy các đoạn xem nhỏ.

0

Câu hỏi của bạn rất chung chung và tôi nghĩ rằng để có câu trả lời, bạn nên đưa ra nhiều gợi ý hơn về cách trang này trông như thế nào và tập dữ liệu lớn như thế nào. Bạn sẽ nhận được tất cả các tòa nhà có thuộc tính theyr hoặc chỉ một lần tại thời điểm? Nguyên nhân cấu trúc dữ liệu của bạn trông rất đơn giản và bất cứ điều gì nhiều hơn một raspberrypi có thể xử lý nó rất tốt.

Nếu bạn cần một bản ghi vào thời điểm bạn không cần bất kỳ kỹ thuật đặc biệt nào, chỉ cần THAM GIA các bảng. Nếu bạn cần liệt kê tất cả các tòa nhà và bạn muốn lưu thời gian db, bạn phải đo lường dữ liệu của mình. Nếu bạn có nhiều thuộc tính hơn các tòa nhà bạn phải chọn một chiều, nếu bạn có 8 thuộc tính và 2000 tòa nhà, bạn có thể nghĩ đến các thuộc tính lưu trong bộ nhớ với một lựa chọn cho mỗi bảng và sau đó in chúng bằng mảng. Tôi không nghĩ rằng bạn sẽ thấy bất kỳ giảm tốc độ hoặc cải thiện với các bảng đơn giản như vậy trên một máy tính hiện đại.

$att1[1]='description1' 
$att1[2]='description2' 
....