Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Có bất kỳ hiệu suất nào tốt hơn khi truy vấn (đặc biệt) MySQL của những điều sau đây:

SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300

over:

SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300

Hoặc giữa cú pháp chỉ được thay thế bằng SQL thứ hai?

Hỏi ngày 7 tháng 12 năm 2010 lúc 23:49Dec 7, 2010 at 23:49

Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Khi tôi nhớ lại, không có sự khác biệt. Nhưng hãy tự mình xem nếu:

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300

and:

explain plan for
SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300

sản xuất các kế hoạch tương tự.

Đã trả lời ngày 7 tháng 12 năm 2010 lúc 23:53Dec 7, 2010 at 23:53

tpditpditpdi

34.1K11 Huy hiệu vàng79 Huy hiệu bạc119 Huy hiệu đồng11 gold badges79 silver badges119 bronze badges

Từ tài liệu:

  • expr giữa minmax

Nếu expr lớn hơn hoặc bằng minexpr nhỏ hơn hoặc bằng max, giữa lợi nhuận 1, nếu không thì nó sẽ trả về 0. Điều này tương đương với biểu thức (minThis is equivalent to the expression (min <= expr AND expr <= max) if all the arguments are of the same type. Otherwise type conversion takes place according to the rules described in Section 11.2, “Type Conversion in Expression Evaluation”, but applied to all the three arguments.

Vì vậy, nó thực sự chỉ là đường cú pháp.

Đã trả lời ngày 7 tháng 12 năm 2010 lúc 23:51Dec 7, 2010 at 23:51

Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Paolo Bergantinopaolo BergantinoPaolo Bergantino

473K79 Huy hiệu vàng518 Huy hiệu bạc436 Huy hiệu Đồng79 gold badges518 silver badges436 bronze badges

SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
5 hiển thị ý định rõ ràng hơn và đọc tốt hơn (điều mà SQL đặt ra để làm).

Đã trả lời ngày 7 tháng 12 năm 2010 lúc 23:51Dec 7, 2010 at 23:51

Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Paolo Bergantinopaolo Bergantinoalex

473K79 Huy hiệu vàng518 Huy hiệu bạc436 Huy hiệu Đồng197 gold badges868 silver badges977 bronze badges

2

SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
5 hiển thị ý định rõ ràng hơn và đọc tốt hơn (điều mà SQL đặt ra để làm).

  1. SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
    
    6
  2. SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
    
    7
  3. SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
    
    8

Alexalex

Fa11enAngel

469K197 Huy hiệu vàng868 Huy hiệu bạc977 Huy hiệu Đồng2 gold badges37 silver badges35 bronze badges

Ba câu sau đây sẽ tạo ra kết quả tương tự:Feb 21, 2017 at 22:24

Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Nhưng trong cấu hình 3 MySQL có thể (tùy thuộc vào các chỉ mục của bạn) sử dụng các chỉ mục khác nhau: vấn đề đặt hàng và bạn nên kiểm tra với Truy vấn giải thích để xem sự khác biệtgsouf

4.5602 Huy hiệu vàng37 Huy hiệu bạc35 Huy hiệu Đồng6 silver badges21 bronze badges

Chúng ta có thể sử dụng giữa trong MySQL không?

MySQL giữa toán tử giữa người vận hành chọn các giá trị trong một phạm vi đã cho. Các giá trị có thể là số, văn bản hoặc ngày. Các toán tử giữa được bao gồm: Giá trị bắt đầu và kết thúc được bao gồm.

Tôi biết tôi đã nhẹ nhàng khi đăng blog trong năm nay. Họ luôn nói rằng cuộc sống có xu hướng cản trở các loại nhiệm vụ này, và năm nay điều đó chắc chắn là đúng. Dù sao, tôi muốn blog này không chỉ là sự ảo hóa máy chủ SQL với VMware vSphere, vì vậy tôi có ý định chi nhánh-không chỉ với nhiều trình ảo hóa hơn (Microsoft Hyper-V 2012 Mẹo và thủ thuật sắp ra mắt!) Mà còn muốn có một số niềm vui hơn Tidbits về Core SQL Server là tốt. & NBSP;

Vì vậy, một vài ngày trước, một trong những khách hàng yêu thích của tôi đã thông qua một câu hỏi từ một trong những chuyên gia tư vấn khác của anh ấy. Câu hỏi là - Tại sao ‘lớn hơn so với và ít hơn so với’ nhanh hơn ’giữa các bộ lọc phạm vi trong các điều khoản ở đâu?

Thật là một câu hỏi tuyệt vời! Hãy để thử nghiệm và xem những kết luận chúng ta có thể rút ra.

SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
9

Tôi sẽ kiểm tra với phạm vi ngày.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
0

Đầu tiên, hãy để tạo ra một container để kiểm tra. Chọn bất kỳ cơ sở dữ liệu ném nào và để bắt đầu!
-- here for the demo, but this could be done anyway you like.
DECLARE @date_from DATETIME;
DECLARE @date_to DATETIME;

- Đặt ngày bắt đầu và ngày. Trong trường hợp này, chúng tôi đang sử dụng-tháng 10 năm 2006. Đặt @Date_From = '1900-01-01'; Đặt @Date_TO = '1999-12-31';
-- the month of october, 2006.
SET @date_from = '1900-01-01';
SET @date_to = '1999-12-31';

Trong khi (@i <100000) bắt đầu - Chọn ngày ngẫu nhiên. Chèn vào dbo.btw (dt) Chọn ( - hãy nhớ rằng, chúng tôi muốn thêm một số ngẫu nhiên vào ngày bắt đầu. Trong SQL, chúng tôi có thể thêm ngày (với tư cách là số nguyên) - vào một ngày để tăng ngày/giờ thực sự - Giá trị đối tượng. @date_from + (- Điều này sẽ buộc số ngẫu nhiên của chúng tôi là gte 0. Là nhị phân (8)) như int)) - số ngẫu nhiên của chúng tôi có thể rất lớn. Chúng tôi không thể có - vượt quá phạm vi ngày mà chúng tôi được đưa ra. - do đó, chúng tôi phải lấy mô đun của ngày - ngày chênh lệch phạm vi. Điều này sẽ cung cấp cho chúng tôi từ 0 đến mức và một ít so với phạm vi ngày. % - để có được số ngày trong phạm vi ngày, chúng tôi - có thể chỉ cần cơ chất vào ngày bắt đầu từ ngày kết thúc. Điểm này mặc dù, chúng ta phải đúc - đến int vì SQL sẽ không thực hiện bất kỳ chuyển đổi tự động nào - cho chúng tôi. Cast ((@date_to - @date_from) là int))) đặt @i = @i + 1 end end

ĐƯỢC RỒI. Chạy khối một vài lần để có được một số lượng tốt trong bảng thử nghiệm của bạn. Đối với các số bên dưới, tôi đang chạy những thứ này trên phòng thí nghiệm nhà của mình với SQL Server 2008R2 và 736.000 bản ghi trong bảng này. Tôi sẽ chỉ gõ một số ngày ngẫu nhiên ra khỏi không khí mỏng và chúng ta đi.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
1

Chọn * từ DBO.BTW trong đó DT giữa '1945-01-08' và '1965-01-01'

Chọn * từ dbo.btw trong đó dt> = '1945-01-08' và dt

Chúng tôi thấy một số kết quả thú vị.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
2

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1483 & NBSP; MS. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
CPU time = 47 ms, elapsed time = 1483 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(147622 Hàng bị ảnh hưởng) Bảng 'BTW'. Quảng số 1, đọc logic 1252, đọc vật lý 0, đọc trước khi đọc 0, logic logic đọc 0, lob đọc vật lý 0, đọc loa đọc 0.
Table 'BTW'. Scan count 1, logical reads 1252, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1964 & NBSP; MS. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
CPU time = 47 ms, elapsed time = 1964 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

Tôi có đầu ra giống hệt nhau ở đây cho mỗi truy vấn. & nbsp; Tôi đã chạy điều này hai mươi lần và nhận được kết quả tương đối giống nhau mỗi lần. Các kế hoạch thực thi truy vấn cũng giống hệt nhau.

Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Di chuột qua quá trình quét chỉ mục phân cụm cho mỗi truy vấn. Họ giống hệt nhau. Nó thậm chí đã chuyển đổi giữa GTE và LTE cho bạn. Ngọt.

Hướng dẫn mysql between vs greater than - mysql giữa vs lớn hơn

Chúng trông giống hệt nhau. Vậy ... tại sao Runtimes luôn khác nhau? Điều gì sẽ xảy ra nếu chúng ta thay đổi thứ tự của các truy vấn? Điều gì về việc làm sạch bộ nhớ để đảm bảo chúng ta không có 'công cụ' nền tảng cản trở? (Đừng chạy các lệnh đó khi sản xuất!)

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
3

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
4

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
5

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
6

Chọn * từ dbo.btw trong đó dt> = '1945-01-08' và dt

Chúng tôi thấy một số kết quả thú vị.

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1483 & NBSP; MS. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
7

(147622 Hàng bị ảnh hưởng) Bảng 'BTW'. Quảng số 1, đọc logic 1252, đọc vật lý 0, đọc trước khi đọc 0, logic logic đọc 0, lob đọc vật lý 0, đọc loa đọc 0.
set statistics io on
set statistics time on

Chọn * từ DBO.BTW trong đó DT giữa '1945-01-08' và '1965-01-01'

Chọn * từ dbo.btw trong đó dt> = '1945-01-08' và dt

Chúng tôi thấy một số kết quả thú vị.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
8

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1483 & NBSP; MS. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
Table 'BTW'. Scan count 1, logical reads 663, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(147622 Hàng bị ảnh hưởng) Bảng 'BTW'. Quảng số 1, đọc logic 1252, đọc vật lý 0, đọc trước khi đọc 0, logic logic đọc 0, lob đọc vật lý 0, đọc loa đọc 0.
CPU time = 32 ms, elapsed time = 800 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1483 & NBSP; MS. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
Table 'BTW'. Scan count 1, logical reads 663, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(147622 Hàng bị ảnh hưởng) Bảng 'BTW'. Quảng số 1, đọc logic 1252, đọc vật lý 0, đọc trước khi đọc 0, logic logic đọc 0, lob đọc vật lý 0, đọc loa đọc 0.
CPU time = 47 ms, elapsed time = 1922 ms.

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1964 & NBSP; MS. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
CPU time = 0 ms, elapsed time = 0 ms.

Tôi có đầu ra giống hệt nhau ở đây cho mỗi truy vấn. & nbsp; Tôi đã chạy điều này hai mươi lần và nhận được kết quả tương đối giống nhau mỗi lần. Các kế hoạch thực thi truy vấn cũng giống hệt nhau.

Di chuột qua quá trình quét chỉ mục phân cụm cho mỗi truy vấn. Họ giống hệt nhau. Nó thậm chí đã chuyển đổi giữa GTE và LTE cho bạn. Ngọt.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
9

Chúng trông giống hệt nhau. Vậy ... tại sao Runtimes luôn khác nhau? Điều gì sẽ xảy ra nếu chúng ta thay đổi thứ tự của các truy vấn? Điều gì về việc làm sạch bộ nhớ để đảm bảo chúng ta không có 'công cụ' nền tảng cản trở? (Đừng chạy các lệnh đó khi sản xuất!)
waitfor delay '00:00:05'
select * from dbo.BTW where DT >= cast('1945-01-08' as datetime) and DT <= cast('1965-01-01' as datetime) set statistics io off set statistics time off

Điều đó đã sửa chữa sự khác biệt trong Runtimes. Bây giờ chúng được đặt ra và các truy vấn đang thực hiện gần như giống hệt nhau.

explain plan for 
SELECT * FROM `table` WHERE `unix_date` BETWEEN 1291736700 AND 1291737300
8

(147622 Hàng bị ảnh hưởng) Bảng 'BTW'. Quảng số 1, đọc logic 663, đọc vật lý 0, đọc trước khi đọc 0, logic logic đọc 0, lob đọc vật lý 0, đọc loa đọc 0.
Table 'BTW'. Scan count 1, logical reads 663, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1280 ms.
CPU time = 47 ms, elapsed time = 1280 ms.

Thời gian thực hiện máy chủ SQL: Thời gian CPU = 0 ms, thời gian trôi qua = 5001 ms. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
CPU time = 0 ms, elapsed time = 5001 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(147622 Hàng bị ảnh hưởng) Bảng 'BTW'. Quảng số 1, đọc logic 663, đọc vật lý 0, đọc trước khi đọc 0, logic logic đọc 0, lob đọc vật lý 0, đọc loa đọc 0.
Table 'BTW'. Scan count 1, logical reads 663, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Thời gian thực hiện SQL Server: CPU Time = 47 ms, Thời gian trôi qua = 1280 ms.
CPU time = 16 ms, elapsed time = 1127 ms.

Thời gian thực hiện máy chủ SQL: Thời gian CPU = 0 ms, thời gian trôi qua = 5001 ms. SQL Server Parse và biên dịch Thời gian: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.
CPU time = 0 ms, elapsed time = 0 ms.

Thời gian thực hiện SQL Server: CPU Time = 16 ms, Thời gian trôi qua = 1127 ms.

Thời gian thực hiện SQL Server: CPU Time = 0 ms, Thời gian trôi qua = 0 ms.

explain plan for
SELECT * FROM `table` WHERE `unix_date` >= 1291736700 AND `unix_date` <= 1291737300
1

Bây giờ, những kết quả này có kết luận về nơi tôi có thể tuyên bố một cách khách quan rằng cái này nhanh hơn so với kết quả kia không? Dĩ nhiên là không. Giữa chỉ là tốc ký cho GTE và LTE dù sao đi nữa. Thời gian thực hiện phải giống nhau, đưa ra hoặc lấy tiếng ồn nền trên máy chủ.
select * from dbo.BTW where DT >= cast('1945-01-08 00:00:00' as datetime) and DT <= cast('1965-01-01 00:00:00' as datetime)

Một điều cần lưu ý giữa giữa là làm thế nào bạn có thể nhận được một số dữ liệu được lọc sai nếu bạn không cẩn thận. Giữa về mặt kỹ thuật lớn hơn và bằng cộng với ít hơn và bằng. Nếu bạn đang sử dụng phạm vi ngày như các ví dụ ở trên, bộ lọc của bạn sẽ dịch thành:

Có nghĩa là gì trong MySQL?

Biểu tượng trong MySQL giống như không bằng toán tử (! =).Cả hai đều cho kết quả trong Boolean hoặc Tinyint (1).Nếu điều kiện trở thành đúng, thì kết quả sẽ là 1 nếu không 0. Trường hợp 1 - sử dụng! =not equal to operator (!=). Both gives the result in boolean or tinyint(1). If the condition becomes true, then the result will be 1 otherwise 0. Case 1 − Using !=

Cái nào tốt hơn và hoặc giữa trong SQL?

Từ góc độ duy trì, giữa có lẽ là tốt hơn.BETWEEN is probably better.

Cái nào nhanh hơn giữa hoặc trong SQL?

Giữa là nhanh hơn do so sánh ít hơn.Với mệnh đề, mỗi yếu tố được đi qua mỗi lần.Nhưng mục đích của cả hai là khác nhau: giữa được sử dụng khi bạn đang so sánh với phạm vi các giá trị theo một loại chuỗi nào đó.. With IN clause each elements are traversed every time. But purpose of both are different: Between is used when you are comparing with Range of values in some kind of sequence.

Chúng ta có thể sử dụng giữa trong MySQL không?

MySQL giữa toán tử giữa người vận hành chọn các giá trị trong một phạm vi đã cho.Các giá trị có thể là số, văn bản hoặc ngày.Các toán tử giữa được bao gồm: Giá trị bắt đầu và kết thúc được bao gồm.The BETWEEN operator selects values within a given range. The values can be numbers, text, or dates. The BETWEEN operator is inclusive: begin and end values are included.