2011-02-07 24 views
5

Tôi tò mò về những bất lợi của trích dẫn số nguyên trong MYSQL truy vấnNhược điểm của trích dẫn số nguyên trong một truy vấn Mysql?

Ví dụ

SELECT col1,col2,col3 FROM table WHERE col1='3'; 

VS

SELECT col1,col2,col3 FROM table WHERE col1= 3; 

Nếu có một chi phí hiệu quả, kích thước của nó và tại sao là những gì nó có xảy ra không? Có bất kỳ disavantages khác khác mà hiệu suất?

Cảm ơn Andrew

Edit: Lý do cho câu hỏi này
1. Bởi vì tôi muốn tìm hiểu sự khác biệt bởi vì tôi tò mò
2. Tôi đang thử nghiệm với một cách để đi qua phím composite từ cơ sở dữ liệu của tôi xung quanh trong mã php của tôi là psudo-Id-keys (PIK). Các PIK này được sử dụng để nhắm mục tiêu bản ghi. Ví dụ, cho một khóa chính (areacode, Thể loại, RecordDtm)

My PIK trong url sẽ trông như thế này:

index.php?action=hello&Id=20001,trvl,2010:10:10 17:10:45 

Và tôi sẽ chọn hồ sơ này như thế này:

$Id = $_POST['Id'];//equals 20001,trvl,2010:10:10 17:10:45 
$sql = "SELECT AreaCode,Category,RecordDtm,OtherColumns.... FROM table WHERE (AreaCode,Category,RecordDtm) = ({$Id}); 
$mysqli->query($sql): 
......and so on. 

Tại thời điểm này truy vấn sẽ không hoạt động vì ngày giờ (phải được trích dẫn) và nó được mở để chèn sql vì tôi đã không thoát khỏi các giá trị đó. Với thực tế là tôi sẽ không bao giờ biết PIK của tôi được xây dựng như thế nào, tôi sẽ viết một hàm chia tách Id PIK tại dấu phẩy, xóa từng phần bằng real_escape_string và đặt nó trở lại cùng với các giá trị được trích dẫn. Ví dụ: $ Id = "'20001', 'trvl', '2010: 10: 10 17:10:45'" Tất nhiên, trong chức năng này tách rời và làm sạch Id tôi có thể kiểm tra xem giá trị là một số hay không. Nếu đó là một số, đừng trích dẫn nó. Nếu nó là bất cứ điều gì, nhưng một chuỗi sau đó trích dẫn nó.

+0

Tại sao không phải lúc nào cũng làm điều đúng đắn thay vì lo lắng về hiệu suất của việc phân tích cú pháp truy vấn sửa lỗi của bạn? –

+0

Tại sao không phải lúc nào cũng dính vào * thứ gì đó * thay vì lo lắng về việc tối ưu hóa sớm? – strager

+1

Bởi vì tôi muốn tìm hiểu thêm một chút về lý do tại sao chúng tôi không chỉ luôn đặt dấu ngoặc kép xung quanh tất cả các giá trị trong truy vấn. Tôi đang thử nghiệm với một cách để vượt qua các phím tổng hợp từ cơ sở dữ liệu như là duy nhất psudo Id trong mã php. – andrew

Trả lời

-1

Have a look at this. Họ đã thực hiện một số đánh giá hiệu suất giữa các loại trường khác nhau.

+4

Đó là các loại dữ liệu, không phải chuyển đổi ngầm. Thứ hai, các kiểu dữ liệu có kích cỡ khác nhau - VARCHAR (4) lấy cùng một số byte như INT. –

1

Theo tôi, tôi nghĩ rằng không có chi phí hiệu suất/kích thước trong trường hợp bạn đã đề cập. Ngay cả khi có, sau đó nó là rất nhiều không đáng kể và sẽ không ảnh hưởng đến ứng dụng của bạn như vậy.

+0

Có nhưng tất nhiên đây là một ví dụ đơn giản. Tôi không có một truy vấn đơn giản. Tôi nghĩ rằng @ Chris Henry giải thích thực tế tốt, rằng trong một truy vấn phức tạp hơn nó sẽ gây ra một vấn đề hiệu suất. – andrew

+0

@Andrew - @Chris giải thích chi phí hoạt động kết hợp với Tham gia đúng. Nhưng trong trường hợp chỉ chuyển đổi kiểu ngầm của nó để kiểm tra eqaulity trong mệnh đề where, nó vẫn không đáng kể. Kiểm tra câu trả lời của @ David quá cho giá trị thử nghiệm. –

6

Chi phí hiệu suất là bất cứ khi nào mysql cần thực hiện chuyển đổi loại từ bất kỳ điều gì bạn đưa nó thành kiểu dữ liệu của cột. Vì vậy, với truy vấn của bạn

CHỌN col1, col2, col3 TỪ bảng WHERE col1 = '3';

Nếu col1 không phải là loại chuỗi, MySQL cần phải chuyển đổi '3' thành loại đó. Loại truy vấn này không thực sự là một vấn đề lớn, vì chi phí hiệu suất của chuyển đổi đó không đáng kể.

Tuy nhiên, khi bạn cố gắng làm điều tương tự khi nói, tham gia 2 bảng có hàng triệu hàng.Nếu các cột trong mệnh đề ON không phải là kiểu dữ liệu tương tự, sau đó MySQL sẽ phải chuyển đổi vài triệu hàng mỗi lần duy nhất bạn chạy truy vấn của bạn, và rằng là nơi mà các chi phí hoạt động do thỏa thuận.

+0

Tôi hoàn toàn không hiểu điều đó. Nó sẽ không chỉ chuyển đổi kiểu dữ liệu một lần cho toàn bộ truy vấn? Tức là chuyển đổi '3' thành 3 lúc đầu và sau đó sử dụng? – andrew

+0

Đối với truy vấn của bạn, có, chuyển đổi sẽ được thực hiện một lần. Tuy nhiên, khi tham gia, để so sánh chính xác, các cột được nối với nhau cần phải cùng loại, do đó chuyển đổi mọi hàng trong bảng. –

+0

thú vị.Tôi có thể thấy làm thế nào mà sẽ thực sự làm chậm hiệu suất. Cảm ơn – andrew

0

Nó cung cấp cho ấn tượng sai về kiểu dữ liệu cho cột. Là người ngoài, tôi cho rằng cột được đề cập là CHAR/VARCHAR & chọn các hoạt động phù hợp.

Nếu không, MySQL, giống như hầu hết các cơ sở dữ liệu khác, sẽ ngầm chuyển đổi giá trị thành bất kỳ kiểu dữ liệu cột nào. Không có vấn đề về hiệu suất với điều này mà tôi biết nhưng có nguy cơ cung cấp giá trị yêu cầu chuyển đổi rõ ràng (sử dụng CAST or CONVERT) sẽ kích hoạt lỗi.

+1

Trong thực tế của tôi, tôi đã có trường hợp khi mysql bất ngờ đúc không phải là giá trị không đổi (số nguyên trích dẫn), nhưng chính trường đó. Vì vậy chỉ số không được sử dụng. – zerkms

+0

CAST và CONVERT là gì? – andrew

+0

@andrew: Tôi đã thấy rõ ràng rằng chúng là những gì bạn sử dụng để thay đổi một cách rõ ràng các loại dữ liệu, nhưng tôi đã thêm một liên kết vào tài liệu chỉ trong trường hợp. –

1

Chuỗi cũng có thứ tự sắp xếp khác với số.

Hãy so sánh:

SELECT 312 < 41 

(sản lượng 0, bởi vì 312 số lượng đưa ra sau khi 41)

tới:

SELECT '312' < '41' 

(sản lượng 1, bởi vì '312' thứ tự từ điển đến trước '41')

Tùy thuộc vào cách truy vấn của bạn được xây dựng bằng cách sử dụng dấu ngoặc kép có thể cho kết quả sai hoặc không có gì cả.

Số nên được sử dụng như vậy, vì vậy không bao giờ sử dụng dấu ngoặc kép trừ khi bạn có lý do đặc biệt để làm như vậy.

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