Dưới đây là ba Truy vấn MySQL. Việc đầu tiên trả về tất cả mọi thứ tôi đang tìm kiếm trong một truy vấn, trong khi hai thứ hai trả về cùng một kết quả tổng hợp, nhưng trong hai truy vấn.Tại sao các Truy vấn MySQL này lại mất một lượng thời gian đáng kể khác nhau để xử lý khi chúng có vẻ tương đương?
Tôi tự hỏi tại sao một truy vấn đơn tốn từ 2-100 lần để chạy, khi có vẻ như thời gian xử lý phải tương đương giữa cả ba truy vấn. Có cách nào để tối ưu hóa truy vấn đơn lẻ để chạy nhanh như các truy vấn riêng lẻ không? Thêm nhiều OR bên trong câu lệnh WHERE của truy vấn đơn không làm tăng thời gian xử lý, nhưng tôi có các trường hợp cần phải thực hiện nhiều OR và cuối cùng truy vấn đơn sẽ nhanh bằng cách chạy mười truy vấn riêng lẻ.
Truy vấn đơn lẻ cũng dường như được lưu trong bộ nhớ cache sau khi nó chạy và có thể mất vài phút để chạy lần đầu tiên, trong khi các truy vấn đơn luôn hoàn tất trong cùng một khung thời gian.
Chỉ mục nhiều cột có tạo nên sự khác biệt lớn ở đây không?
Lưu ý là bảng không có trường ID làm chỉ mục chính. Điều này có gây ra hành vi không mong muốn này không?
Thật khó để chạy thử nghiệm ở đây vì bảng có hàng trăm triệu hàng và thêm cột và chỉ mục mất gần một ngày.
SINGLE QUERY (4.2s)
SELECT name_id
FROM staging_company_search
WHERE
(name_word_0 = 'the' AND name_word_1 = 'glazier')
OR (name_word_0 = 'bridgewaters' AND name_word_1 = '');
GỘP TƯƠNG ĐƯƠNG truy vấn (0.8s mỗi)
SELECT name_id
FROM staging_company_search
WHERE name_word_0 = 'the' AND name_word_1 = 'glazier';
SELECT name_id
FROM staging_company_search
WHERE name_word_0 = 'bridgewaters' AND name_word_1 = '';
GIẢI THÍCH VỀ NHỮNG VƯỚNG MẮC
id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE staging_company_search range name_word_0,name_word_1 name_word_0 102 NULL 2197605 Using index condition; Using where
1 SIMPLE staging_company_search ref name_word_0,name_word_1 name_word_1 102 const 128 Using index condition; Using where
1 SIMPLE staging_company_search ref name_word_0,name_word_1 name_word_0 102 const 33 Using index condition; Using where
DATABASE SCHEMA
CREATE TABLE `staging_company_search` (
`name_id` int(11) unsigned NOT NULL DEFAULT '0',
`name_word_0` varchar(100) NOT NULL,
`name_word_1` varchar(100) NOT NULL,
KEY `name_id` (`name_id`),
KEY `name_word_0` (`name_word_0`),
KEY `name_word_1` (`name_word_1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
gì xảy ra nếu bạn cố gắng ĐÂU (name_word_0, name_word_1) trong (('the', 'nghề làm kiếng'), ('bridgewaters', '')) trong truy vấn đầu tiên? –
Thậm chí chậm hơn. Truy vấn đó cũng chứa logic hơi khác và kết quả trong bốn kết hợp của name_words trái ngược với hai. –
Tôi hiểu. Làm thế nào về một liên minh của hai truy vấn tổng hợp tương đương? EXPLAIN PLAN có cho thấy sự khác biệt nào giữa hai điều này không? –