मैंने देखा है कि FORCE INDEX तब मदद करता है जब आपके पास VARCHAR फ़ील्ड पर कई जॉइन और सब-क्वेरी होते हैं, जहाँ FK और संदर्भित मान दोनों प्राथमिक कुंजी नहीं होते हैं, जबकि एक ही समय में DATE फ़ील्ड पर जहाँ क्लॉज़ होता है।
कुछ इस तरह:
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 हमेशा PK और FK का उपयोग करेगा, जहां आप पहले भुगतान तालिका पर payment_date अनुक्रमणिका का उपयोग करेंगे क्योंकि यह सबसे बड़ा है। तो एक FORCE INDEX(payment_date)
भुगतान तालिका में शामिल होने से बहुत मदद मिलेगी।
यह तृतीय-पक्ष बिलिंग डेटाबेस का एक उदाहरण है जिसका उपयोग हम कार्यस्थल पर करते हैं। अनुकूलन के साथ हमारे पास बहुत बड़ी समस्याएं थीं, और FORCE INDEX ने ज्यादातर समय काम किया। आमतौर पर हमें mysqladmin के साथ धीमी क्वेरी मिली, उन्हें FORCE INDEX के साथ परीक्षण किया और उन्हें विक्रेताओं को ऐप के स्रोत कोड में फिर से लिखने के लिए भेजा।
उदाहरण पर बेहतर पकड़ पाने के लिए ये चार टेबल हैं:
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;