Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cột rand () của truy vấn con được đánh giá lại cho mọi lựa chọn lặp lại trong MySQL 5.7 / 8.0 so với MySQL 5.6

Như đã đề cập trong Bản phát hành quan trọng của MySQL 8.0.0 có sẵn ,

Tôi cho rằng đây là nguyên nhân của hành vi mà tôi đang quan sát thấy trong các phiên bản MySQL mới hơn. Gợi ý đã đề cập có thể được sử dụng với MySQL 8.0 để buộc RAND () chỉ được gọi một lần:

SELECT  /* NO_MERGE(q) */
        q.i,
        q.r,
        q.r
FROM    (
        SELECT 
                id AS i,
                (FLOOR(RAND(100) * 4)) AS r
        FROM t
        ) AS q;

+---+-----+-----+
| i |  r  |  r  |
+---+-----+-----+
| 1 |   0 |   0 |
| 2 |   2 |   2 |
| 3 |   3 |   3 |
| 4 |   2 |   2 |
| 5 |   1 |   1 |
+---+-----+-----+

Tuy nhiên, điều này không có sẵn trong 5.7. Để đạt được hành vi mong muốn với 5.7, hãy thêm LIMIT <a very high number> vào định nghĩa bảng dẫn xuất (tôi đang sử dụng LONG_MAX có chữ ký bên dưới). Cảm ơn Roy Lyseng về giải pháp này .

SELECT
        q.i,
        q.r,
        q.r
FROM    (
        SELECT 
                id AS i,
                (FLOOR(RAND(100) * 4)) AS r
        FROM t LIMIT 9223372036854775807
        ) AS q;

+---+-----+-----+
| i |  r  |  r  |
+---+-----+-----+
| 1 |   0 |   0 |
| 2 |   2 |   2 |
| 3 |   3 |   3 |
| 4 |   2 |   2 |
| 5 |   1 |   1 |
+---+-----+-----+

Như philipxy được đề cập trong nhận xét, kết quả của một biểu thức truy vấn phải được xác định chặt chẽ bất kể bất kỳ tối ưu hóa nào đang được áp dụng. Có nghĩa là nó là một lỗi trình tối ưu hóa trong MySQL 5.7 / 8.0.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không có kết quả sau khi xóa mysql ft_stopword_file

  2. Nhận kết quả từ mysql dựa trên kinh độ vĩ độ

  3. Cơ sở dữ liệu tìm kiếm PDO sử dụng LIKE

  4. Tìm kiếm phân biệt chữ hoa chữ thường MYSQL (sử dụng chế độ ngủ đông) cho utf8

  5. Trả về null cho date_format khi đầu vào là null trong mysql