Tôi có một cơ sở dữ liệu sqlite với hai bảng, mỗi bảng có 50.000 hàng, chứa tên của những người (giả). Tôi đã tạo một truy vấn đơn giản để tìm hiểu có bao nhiêu tên (tên đã cho, tên đệm ban đầu, họ) chung cho cả hai bảng:
select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;
Khi không có chỉ mục nào ngoại trừ các khóa chính (không liên quan đến truy vấn này), nó sẽ chạy nhanh:
[james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 0m0.115s
user 0m0.111s
sys 0m0.004s
Nhưng nếu tôi thêm chỉ mục vào ba cột trên mỗi bảng (tất cả sáu chỉ mục):
CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` )
//etc.
sau đó nó chạy chậm một cách đau đớn:
[james@marlon Downloads] $ time sqlite3 generic_data.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 1m43.102s
user 0m52.397s
sys 0m50.696s
Có bất kỳ vần điệu hoặc lý do cho điều này?
Đây là kết quả của EXPLAIN QUERY PLAN
phiên bản không có chỉ mục:
0|0|0|SCAN TABLE fakenames_uk
0|1|1|SEARCH TABLE fakenames_usa USING AUTOMATIC COVERING INDEX (middleinitial=? AND surname=? AND givenname=?)
Đây là với các chỉ mục:
0|0|0|SCAN TABLE fakenames_uk
0|1|1|SEARCH TABLE fakenames_usa USING INDEX idx_us_middleinitial (middleinitial=?)
middleinitial
,surname
vàgivenname
)?