Hàng mysql
Khi bạn muốn thực hiện một câu truy vấn (truy vấn), MySQL Query Optimizer sẽ cố gắng đưa ra một kế hoạch tối ưu nhất cho việc thực hiện truy vấn. Bạn có thể xem thông tin về kế hoạch đó bằng cách thêm lệnh 0 vào đầu mỗi truy vấn. 0 là một trong những công cụ quan trọng giúp hiểu và tối ưu truy vấn MySQL, tuy nhiên, điều đáng tiếc là rất nhiều lập trình viên mới khi sử dụng nó. Trong bài viết này, bạn sẽ được nghiên cứu ý nghĩa của từng thành phần trong kết quả trả về của 0 và cách sử dụng nó để tối ưu hóa thiết kế cơ sở dữ liệu cũng như câu truy vấn Show
Tìm hiểu kết quả trả về của lệnh ********************** 1. row ********************** id: 1 select_type: SIMPLE table: Country type: const possible_keys: PRIMARY key: PRIMARY key_len: 3 ref: const rows: 1 filtered: 100.00 Extra: ********************** 2. row ********************** id: 1 select_type: SIMPLE table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 filtered: 100.00 Extra: Using where 2 rows in set, 1 warning (0.00 sec) 0Việc sử dụng 0 hết sức đơn giản, chỉ cần thêm nó vào trước 5 trong câu hỏi. Trước tiên, hãy cùng tìm hiểu kết quả trả về của một câu truy vấn đơn giản để bạn có thể làm quen với các cột trong bảng kết quả
Có rất nhiều thông tin được bao hàm trong 10 cột trên. Which is
Bạn có thể bổ sung thêm từ khóa 01 sau khi 0 và MySQL sẽ đưa ra các thông tin bổ sung về quá trình thực hiện truy vấn. Để xem chi tiết, hãy thực hiện lệnh 03 ngay sau lệnh 0. Nó thường được sử dụng để xem các câu truy vấn được thực hiện sau bất kỳ sự thay đổi nào được tạo ra bởi Trình tối ưu hóa truy vấn
Khắc phục sự cố về hiệu năng với EXPLAINGiờ hãy cùng tìm hiểu cách nào chúng ta có thể tối ưu hóa một truy vấn hiệu năng thấp bằng cách phân tích kết quả của 0. Trong thực tế, không có gì phải nghi ngờ khi chúng ta sẽ có rất nhiều bảng với rất nhiều quan hệ với nhau, tuy nhiên đôi khi thật khó để biết được cách tốt nhất để viết một câu hỏiỞ đây, tôi đã tạo ra một cơ sở dữ liệu mẫu cho một ứng dụng thương mại ứng dụng mà ở đó không có mục chính, từ khóa chính và sẽ mô tả ảnh hưởng của thiết kế suy thoái này bằng cách viết ra các truy vấn phức tạp. Bạn có thể tải xuống Mô hình DB từ Github
Nhìn vào kết quả trên, bạn thấy được tất cả các biểu hiện của một vấn đề tồi tệ. Tuy nhiên, kể cả khi tôi viết truy vấn tốt hơn, thì kết quả vẫn tương tự, do không có mục đích. Loại tham gia là 06 (kém tồi tệ nhất), có nghĩa là MySQL không thể xác định bất kỳ từ khóa nào để sử dụng cho tham gia, và do vậy cả 8 và 4 đều trống. Quan trọng hơn, trường 6 cho thấy MySQL phải duyệt tất cả các bản ghi của từng bảng cho câu hỏi này. Có nghĩa là để chạy câu truy vấn, nó cần phải duyệt 10 bản ghi để tìm ra kết quả. Điều này thật khủng khiếp và nó sẽ còn tăng cường hơn nữa khi cơ sở dữ liệu lớn hơnBây giờ, chúng ta sẽ thử thêm 1 số mục khác hiển thị, giống như từ khóa chính cho từng bảng, và thực hiện truy vấn một lần nữa. Theo thông tin cơ bản, bạn tìm đến các cột được sử dụng để THAM GIA và để chúng làm từ khóa, bởi MySQL sẽ luôn tìm theo các cột đó để tra cứu các bản ghi
Giờ chúng ta chạy lại truy vấn sau khi đã thêm chỉ mục
Sau khi thêm chỉ mục, số lượng bản ghi cần được duyệt giảm xuống còn 11. Điều đó có nghĩa là, với mỗi bản ghi có 12 là 10101 trong bảng 13, MySQL có thể tìm thấy trự tiếp bản ghi đối tượng trong tất cả các bản ghi khác bằng cách sử dụng chỉ mục và không cần phải duyệt lại cả bảngỞ dòng đầu tiên, loại tham gia là 1, loại nhanh nhất với bảng có nhiều hơn 1 bản ghi. MySQL can use main key in this field. Trường 6 trả về kết quả 1, có nghĩa là không có gì ngoài giá trị 10101 được sử dụng trong lệnh 17Tiếp theo hãy xem một truy vấn khác. Ở đây, chúng ta chỉ đơn giản là hợp 2 bảng lại, 18 và 19, cả hai đều được tham gia với 20. Bảng 19 bao gồm các biến có thể của 22 ở dạng khóa bên ngoài 0 1Bạn có thể thấy rất nhiều vấn đề trong câu hỏi này. Nó duyệt tất cả các bản ghi ở bảng 18 và 19. Vì không có bất kỳ mục nào trong các bảng này cho trường 25 và 26, kết quả trả về cột 8 và 4 đều trống. Trạng thái của 18 và 30 được kiểm tra sau khi hợp lại 2, do vậy công việc cho họ vào trong 2 sẽ làm giảm số lượng bản ghi. Giờ chúng ta thử thêm vài mục và viết lại truy vấn 2_______7_______3 4Như bạn thấy ở kết quả, số lượng dòng được duyệt giảm đáng kể, từ 33 xuống còn 34, thực sự là một hiệu quả rất đáng ghi nhận. Nếu bạn cố gắng chạy cùng một truy vấn mà không sắp xếp lại từ trước, ngay sau khi thêm chỉ mục, bạn sẽ không thể thấy số lượng giảm đáng kể như vậy. MySQL không thể sử dụng chỉ mục bởi nó sử dụng 17 trong kết quả trả về. Sau khi chuyển điều kiện sang bên trong 2, MySQL has been used index. Điều đó có nghĩa là thêm chỉ mục không phải là đủ, MySWL sẽ không thể sử dụng chỉ mục đó trừ khi bạn viết câu truy vấn thích hợpKết luậnTrong bài viết này, tôi đã thảo luận về từ khóa 0 của MySQL, ý nghĩa của kết quả trả về và cách sử dụng nó để viết truy vấn tốt hơn. Trong thực tế, nó còn có thể hữu dụng hơn ví dụ được đưa ra ở đây. Thực tế, bạn sẽ thường xuyên tham gia nhiều bảng với câu lệnh 17 phức tạp. Việc chỉ đơn giản thêm chỉ mục sẽ không phải lúc nào cũng giúp bạn, bạn cần dành thời gian suy nghĩ kỹ càng hơn và viết truy vấn tốt hơnQuan điểm cá nhânLần đầu tiên tôi biết đến 0 cũng là khi tôi biết được chương trình của mình thực hiện quá nhiều truy vấn sử dụng 40 (Phần 8 trả về 00). Đây là 1 sắp xếp không có chỉ mục và rất nguy hiểm khi làm việc với lượng dữ liệu lớn. Việc sử dụng 0 giúp tôi phát hiện ra sự thiếu xót trong thiết kế DB của mình ở thời điểm đó và qua đó biết cách chỉnh sửa thiết kế của mìnhNgày nay, việc sử dụng các khung hỗ trợ ORM khiến cho các thành viên lập trình không quan tâm đến quá trình truy vấn dữ liệu trong DB, kéo theo đó là các vấn đề về hiệu năng khi ứng dụng được bật lên. Ngược lại, việc viết truy vấn bằng tay, bất chấp thời gian nhưng trả lại hiệu quả cao về hiệu năng sau này cũng như nâng cao hiểu biết của người lập trình. Khi tôi còn đang thực hiện tập tin sinh, tôi phải viết tất cả truy vấn bằng tay và theo chỉ định của người hướng dẫn, tôi phải tự 0 tất cả truy vấn trước khi viết mã. Những kinh nghiệm đó đã giúp tôi tích lũy được rất nhiều kinh nghiệm cho công việc sau này. Rất mong mọi người cũng có cùng điểm và dành thời gian 0 câu hỏi của mình trước khi bắt tay vào code ứng dụng thực tế |