Tôi đã đọc các bài viết về FORCE
chỉ mục, nhưng làm cách nào để buộc MySQL IGNORE ALL
lập chỉ mục?
Tôi đã thử SELECT * FROM tbl IGNORE INDEX(*)
, nhưng tôi đã không thành công.
Về lý do tại sao tôi (và những người khác) cần phải làm điều này: Ví dụ: tôi cần tóm tắt số liệu thống kê người giới thiệu bằng tld như thế này:
SELECT
count(*) as c,
SUBSTRING
(
domain_name,
LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2
) as tld
FROM `domains_import`
IGNORE INDEX(domain_name)
GROUP BY tld
ORDER BY c desc
LIMIT 100
... nhưng tôi luôn phải xem xét các chỉ mục nào được xác định hoặc xác định chỉ mục nào sẽ được sử dụng thông qua Giải thích. Nó sẽ rất tiện dụng chỉ đơn giản là viết IGNORE INDEX ALL
và đơn giản là không quan tâm.
Có ai biết cú pháp hay hack không? (Hàng chục dòng thông qua các bảng định nghĩa MySQL thực sự không phải là một phím tắt).
Đã thêm từ thảo luận trò chuyện :
Bechmark:
không có chỉ số = 148,5 giây
với chỉ số = 180 giây và vẫn đang chạy với Gửi dữ liệu Mảng SSD rất mạnh, đến nỗi bạn gần như không quan tâm đến bộ đệm dữ liệu ...
Định nghĩa cho điểm chuẩn:
CREATE TABLE IF NOT EXISTS `domains_import` (
`domain_id` bigint(20) unsigned NOT NULL,
`domain_name` varchar(253) CHARACTER SET ascii COLLATE ascii_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `domains_import`
ADD PRIMARY KEY (`domain_id`),
ADD UNIQUE KEY `domain_name` (`domain_name`);
ALTER TABLE `domains_import`
MODIFY `domain_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT;
InnoDB, thử nghiệm với chỉ mục (không có USE INDEX () hoặc tương tự) vẫn đang chạy, 250 giây, tôi vừa giết nó.
LEFT JOIN
tôi có. `USE INDEX ()` khiến MySQL thực hiện quét bảng trên bảng hàng 20K và 1 đến 1JOIN
thay vì vượt qua 500 hàng giữa hai chỉ mục. Nhanh hơn gấp 20 lần.