2009-09-09 34 views
5

Nếu đó là một int, tôi biết nó sẽ nhanh hơn, chỉ không thể hiểu được loại chuỗi.Đối với cột char/varchar/text, tại sao một chỉ mục cho cột đó giúp tìm kiếm nhanh hơn?

ghi chú: hầu hết ngôn ngữ châu Á không có khoảng cách giữa các từ. và mysql không thể chia câu thành từ. và tôi cũng có nghĩa là tìm kiếm ngẫu nhiên, có nghĩa là, các từ có thể xuất hiện ở bất kỳ nơi nào trong một câu.

+0

Hãy suy nghĩ về chuỗi là một chuỗi số ... trợ giúp? –

Trả lời

6

Một điểm lớn là chỉ mục sẽ không giúp ích gì cho một số loại tìm kiếm nhất định. Ví dụ:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%' 

Không có số lượng chỉ mục bình thường sẽ giúp truy vấn đó. Nó mãi mãi phải chịu số phận chậm. Biểu hiện LIKE không chỉ là sargable.

Tại sao? Trước tiên, bạn cần phải hiểu cách các chỉ mục hoạt động. Về cơ bản, họ lấy các cột được lập chỉ mục cùng với khóa chính (con trỏ ghi) vào một bảng mới. Sau đó, họ sắp xếp bảng đó trên cột được lập chỉ mục thay vì khóa. Khi bạn tìm kiếm bằng cách sử dụng chỉ mục, nó có thể nhanh chóng tìm thấy (các) hàng bạn muốn vì chỉ mục này được sắp xếp để tạo điều kiện tìm kiếm hiệu quả hơn bằng các thuật toán như tìm kiếm nhị phân và các thuật toán khác.

Bây giờ hãy xem lại truy vấn đó. Bằng cách đặt một ký tự đại diện ở phía trước văn bản tìm kiếm, bạn vừa nói với cơ sở dữ liệu mà bạn không biết chắc chắn cột của bạn bắt đầu bằng gì. Không có số lượng phân loại sẽ giúp; bạn vẫn cần phải đi qua toàn bộ bảng để chắc chắn rằng bạn tìm thấy mọi bản ghi phù hợp với biểu thức. Và điều đó có nghĩa là bất kỳ chỉ mục bình thường nào trên cột đều vô giá trị cho truy vấn này.

Nếu bạn muốn tìm kiếm cột văn bản cho chuỗi tìm kiếm ở bất kỳ đâu trong cột, bạn cần phải sử dụng một chút khác biệt: chỉ mục toàn văn.

Bây giờ cho độ tương phản nhìn vào truy vấn này:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%' 

này sẽ làm việc hoàn toàn tốt đẹp với một chỉ số bình thường, bởi vì bạn biết làm thế nào bạn mong đợi cột để bắt đầu. Nó vẫn có thể khớp với các giá trị được sắp xếp được lưu trữ trong chỉ mục, và vì vậy chúng ta có thể nói rằng nó là sargable.

+0

vâng, đây là những gì tôi tự hỏi, cảm ơn. – lovespring

4

Chỉ mục được sắp xếp, một bảng thì không. Vì vậy, khi bạn đang tìm kiếm trên một chỉ mục, nó có một đầu mối về nơi để tìm chuỗi, ngay cả khi có một giá trị khác nhau cho mỗi hàng trong bảng.

Hơn nữa, chỉ số nhỏ hơn (thường) so với bảng, do đó, để quét từng cột trong bảng, bạn phải đi qua từng hàng. Tìm kiếm chỉ mục là tìm đúng vị trí trong chỉ mục, chọn đó, lấy con trỏ đến chỉ mục nhóm, và bạn đi để lấy phần còn lại của hàng.

+1

Nếu dữ liệu của bạn chủ yếu là duy nhất trong vài ký tự đầu tiên, không lập chỉ mục phần còn lại của cột char/varchar và các chỉ mục mà cơ sở dữ liệu tạo sẽ nhỏ hơn nhiều. Hầu hết các cơ sở dữ liệu tôi đã sử dụng luôn yêu cầu giới hạn độ dài chuỗi để lập chỉ mục các cột văn bản. – sj2009

+0

không, tìm kiếm là tìm kiếm ngẫu nhiên, đã chỉnh sửa bài đăng của tôi, xem ghi chú của tôi. – lovespring

0

Chỉ mục cơ bản là bảng 2 cột, với trường được lập chỉ mục theo thứ tự được sắp xếp cùng với tra cứu PK. SO cho một chuỗi, nó có các chuỗi theo thứ tự sắp xếp. Một tìm kiếm sau đó có thể được thực hiện bằng cách sử dụng một tìm kiếm nhị phân thay vì một bảng quét, đó là có được cách nhanh hơn cho hầu như bất kỳ chiều dài của bảng.

1

Chỉ mục cơ bản giống như chỉ mục trong sách, trong đó mỗi từ (tùy thuộc vào sách) xuất hiện trong sách được đặt trong chỉ mục, với số trang nơi từ đó xuất hiện. Chỉ mục được sắp xếp theo thứ tự bảng chữ cái, do đó, tìm nhanh từ trong chỉ mục. Nếu bạn không có chỉ mục trong một cuốn sách, cách duy nhất để tìm mọi trường hợp của một từ cụ thể là đọc qua toàn bộ cuốn sách, ghi chú nơi từ đó xuất hiện.

Bàn chỉ giống nhau. Nếu bạn tìm kiếm một bản ghi có giá trị cột cụ thể và bạn không có chỉ mục, điều duy nhất cơ sở dữ liệu có thể làm là lặp qua toàn bộ bảng để tìm bất kỳ kết quả nào.

1

Sổ điện thoại được lập chỉ mục trên họ. Bạn có thể tưởng tượng làm thế nào chậm tìm kiếm một số sẽ được nếu nó không?

2

Câu trả lời đơn giản nhất là một vài câu hỏi:

  • Tại sao việc tìm kiếm một người bằng/cô tên cuối cùng của ông rất nhanh trong cuốn sách điện thoại không?
  • Tại sao tìm một người theo số trước tiên tên không phải nhanh chóng trong danh bạ điện thoại?
Các vấn đề liên quan