Làm thế nào để sử dụng chỉ mục trong câu lệnh select?


97

Giả sử trong bảng nhân viên, tôi đã tạo một chỉ mục (idx_name) trên emp_namecột của bảng.

Tôi có cần phải chỉ định rõ ràng tên chỉ mục trong mệnh đề select hay nó sẽ tự động được sử dụng để tăng tốc các truy vấn.

Nếu nó được yêu cầu phải được chỉ định trong mệnh đề select, thì cú pháp để sử dụng chỉ mục trong truy vấn select là gì?

Câu trả lời:


86

Nếu bạn muốn kiểm tra chỉ mục để xem nó có hoạt động hay không, thì đây là cú pháp:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Câu lệnh WITH sẽ buộc chỉ mục được sử dụng.


82
Bài đăng này không trả lời câu hỏi. Tóm lại, câu trả lời là: bạn không phải chỉ định chỉ mục trong truy vấn. Nó được sử dụng (hoặc không) một cách tự động. Bạn có thể buộc nó, tuy nhiên. Thêm chi tiết (khi nào và tại sao làm điều này) trong các bài viết khác bên dưới.
Rast

34

Câu hỏi hay,

Thông thường, công cụ DB sẽ tự động chọn chỉ mục để sử dụng dựa trên các kế hoạch thực thi truy vấn mà nó xây dựng. Tuy nhiên, có một số trường hợp khá hiếm khi bạn muốn buộc DB sử dụng một chỉ mục cụ thể.

Để có thể trả lời câu hỏi cụ thể của bạn, bạn phải chỉ định DB bạn đang sử dụng.

Đối với MySQL, bạn muốn đọc tài liệu Cú pháp Gợi ý Chỉ mục về cách thực hiện việc này


30

Làm thế nào để sử dụng chỉ mục trong câu lệnh select?
cách này:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

Và nhiều cách khác để kiểm tra điều này

Tôi có cần chỉ định rõ ràng không?

  • Không, không Cần chỉ định rõ ràng.
  • Công cụ DB sẽ tự động chọn chỉ mục để sử dụng dựa trên kế hoạch thực thi truy vấn mà nó xây dựng từ câu trả lời @Tudor Constantin.
  • Trình tối ưu hóa sẽ đánh giá xem việc sử dụng chỉ mục của bạn có làm cho truy vấn của bạn chạy nhanh hơn không và nếu có, nó sẽ sử dụng chỉ mục. từ câu trả lời @niktrl

13

Nói chung , chỉ mục sẽ được sử dụng nếu chi phí giả định của việc sử dụng chỉ mục và sau đó có thể phải thực hiện thêm các tra cứu dấu trang thấp hơn chi phí chỉ quét toàn bộ bảng.

Nếu truy vấn của bạn có dạng:

SELECT Name from Table where Name = 'Boris'

Và 1 trong số 1000 hàng có tên Boris, nó gần như chắc chắn sẽ được sử dụng. Nếu tên của mọi người là Boris, nó có thể sẽ sử dụng đến việc quét bảng, vì chỉ mục không có khả năng là một chiến lược hiệu quả hơn để truy cập dữ liệu.

Nếu đó là một bảng rộng (nhiều cột) và bạn thực hiện:

SELECT * from Table where Name = 'Boris'

Sau đó, nó vẫn có thể chọn thực hiện quét bảng, nếu đó là một giả định hợp lý rằng nó sẽ mất nhiều thời gian hơn để truy xuất các cột khác từ bảng so với việc chỉ tìm kiếm tên hoặc một lần nữa, nếu nó có khả năng truy xuất rất nhiều hàng dù sao.


9

Trình tối ưu hóa sẽ đánh giá xem việc sử dụng chỉ mục của bạn có làm cho truy vấn của bạn chạy nhanh hơn không và nếu có, nó sẽ sử dụng chỉ mục.

Tùy thuộc vào RDBMS của bạn, bạn có thể buộc sử dụng một chỉ mục, mặc dù nó không được khuyến khích trừ khi bạn biết mình đang làm gì.

Nói chung, bạn nên lập chỉ mục các cột mà bạn sử dụng trong các câu lệnh nối bảng và where


5

Bằng cách sử dụng cột mà chỉ mục được áp dụng trong các điều kiện của bạn, nó sẽ tự động được đưa vào. Bạn không nhất thiết phải sử dụng nó, nhưng nó sẽ tăng tốc các truy vấn khi nó được sử dụng.

SELECT * FROM TABLE WHERE attribute = 'value'

Sẽ sử dụng chỉ mục thích hợp.


5

Nói chung, khi bạn tạo một chỉ mục trên một bảng, cơ sở dữ liệu sẽ tự động sử dụng chỉ mục đó trong khi tìm kiếm dữ liệu trong bảng đó. Bạn không cần phải làm bất cứ điều gì về điều đó.

Tuy nhiên, trong MSSQL, bạn có thể chỉ định một index hintchỉ mục có thể chỉ định rằng một chỉ mục cụ thể nên được sử dụng để thực hiện truy vấn này. Thông tin thêm về điều này có thể được tìm thấy ở đây .

Index hintdường như cũng có sẵn cho MySQL . Cảm ơn Tudor Constantine.


1

Gợi ý chỉ mục chỉ có sẵn cho các máy chủ cơ sở dữ liệu Microsoft Dynamics. Đối với SQL Server truyền thống, các bộ lọc bạn xác định trong mệnh đề 'Ở đâu' sẽ thuyết phục công cụ sử dụng bất kỳ chỉ số nào có liên quan ... Miễn là kế hoạch thực thi của công cụ có thể xác định hiệu quả cách đọc thông tin (cho dù là quét toàn bộ bảng hay quét được lập chỉ mục ) - nó phải so sánh cả hai trước khi thực hiện câu lệnh phù hợp, như một phần của trình tối ưu hóa hiệu suất tích hợp của nó.

Tuy nhiên, bạn có thể buộc trình tối ưu hóa quét bằng cách sử dụng một cái gì đó như

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Hoặc để tìm kiếm một chỉ mục cụ thể bằng cách sử dụng một cái gì đó như

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

Sự lựa chọn là của bạn. Nhìn vào các thuộc tính chỉ mục của bảng trong bảng đối tượng để biết bạn muốn sử dụng chỉ mục nào. Nó phải phù hợp với (các) bộ lọc của bạn.

Để có kết quả tốt nhất, trước tiên hãy liệt kê các bộ lọc sẽ trả lại ít kết quả nhất. Tôi không biết mình nói có đúng không, nhưng có vẻ như các bộ lọc truy vấn là tuần tự; nếu bạn làm đúng trình tự của mình, trình tối ưu hóa không cần phải làm điều đó cho bạn bằng cách so sánh tất cả các kết hợp hoặc ít nhất là không bắt đầu so sánh với các truy vấn đắt tiền hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.