Saya telah membaca artikel tentang FORCE
indeks, tetapi bagaimana saya bisa memaksa MySQL ke IGNORE ALL
indeks?
Saya mencoba SELECT * FROM tbl IGNORE INDEX(*)
, tetapi saya tidak berhasil.
Adapun mengapa saya (dan lainnya) perlu melakukan ini: Misalnya, saya perlu merangkum statistik referensi dengan tld seperti ini:
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
... tapi saya selalu harus melihat indeks apa yang didefinisikan atau menentukan indeks apa yang akan digunakan melalui Jelaskan. Akan sangat berguna untuk sekadar menulis IGNORE INDEX ALL
dan tidak peduli.
Adakah yang tahu sintaks atau hack? (Puluhan baris melalui tabel definisi MySQL benar-benar bukan jalan pintas).
Ditambahkan dari diskusi obrolan :
Bechmark:
tidak ada indeks = 148,5 detik
dengan indeks = 180 detik dan masih berjalan dengan Mengirim data Array SSD sangat kuat, sehingga Anda hampir tidak peduli dengan cache data ...
Definisi untuk tolok ukur:
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, tes dengan indeks (tanpa USE INDEX () atau serupa) masih berjalan, 250 detik, saya baru saja membunuhnya.
LEFT JOIN
saya miliki. `USE INDEX ()` membuat MySQL melakukan pemindaian tabel pada tabel 20K dan 1-ke-1JOIN
alih-alih melintasi 500 baris di antara dua indeks. Mendapat 20x lebih cepat.