Saya perhatikan bahwa FORCE INDEX membantu ketika Anda memiliki beberapa gabungan dan sub-kueri pada bidang VARCHAR di mana FK dan nilai yang direferensikan bukan merupakan kunci utama, sementara pada saat yang sama memiliki klausa where pada bidang DATE.
Sesuatu seperti:
SELECT NAME, a.reference_no, i.value, p.value FROM customers AS c
INNER JOIN accounts AS a ON c.id = a.customer_id
INNER JOIN invoices AS i ON i.reference_no = a.reference_no
INNER JOIN payments AS p ON p.invoice_no = i.invoice_no
WHERE payments.date >= '2011-09-01' AND DATE < '2011-10-01';
mysql akan selalu menggunakan PK dan FK, di mana Anda akan menggunakan indeks payment_date pada tabel pembayaran terlebih dahulu karena ini adalah yang terbesar. Jadi FORCE INDEX(payment_date)
di tabel pembayaran bergabung akan banyak membantu.
Ini contoh dari database penagihan pihak ketiga yang kami gunakan di tempat kerja. Kami memiliki masalah besar dengan pengoptimalan, dan FORCE INDEX melakukan pekerjaan itu hampir sepanjang waktu. Biasanya kami menemukan permintaan lambat dengan mysqladmin, mengujinya dengan FORCE INDEX dan mengirimkannya ke vendor untuk menulis ulang dalam kode sumber aplikasi.
Berikut adalah empat tabel untuk memahami contoh dengan lebih baik:
CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
CREATE TABLE `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`customer_id` int(11) NOT NULL,
`reference_no` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `reference_no_uniq` (`reference_no`),
KEY `FK_accounts` (`customer_id`),
CONSTRAINT `FK_accounts` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
CREATE TABLE `invoices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`reference_no` varchar(10) NOT NULL,
`invoice_no` varchar(10) NOT NULL,
`value` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `invoice_no_uniq` (`invoice_no`),
KEY `FK_invoices` (`reference_no`),
CONSTRAINT `FK_invoices` FOREIGN KEY (`reference_no`) REFERENCES `accounts` (`reference_no`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
CREATE TABLE `payments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`invoice_no` varchar(10) NOT NULL,
`value` int(11) NOT NULL,
`date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_payments` (`invoice_no`),
KEY `payment_date` (`date`),
CONSTRAINT `FK_payments` FOREIGN KEY (`invoice_no`) REFERENCES `invoices` (`invoice_no`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;