Tôi nhận thấy rằng FORCE INDEX hữu ích khi bạn có nhiều kết hợp và truy vấn phụ trên các trường VARCHAR trong đó cả FK và giá trị được tham chiếu không phải là khóa chính, đồng thời có mệnh đề where trên trường DATE.
Một cái gì đó như:
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 sẽ luôn sử dụng PK và FK, trong đó bạn sẽ sử dụng chỉ mục Payment_date trên bảng thanh toán trước vì nó là chỉ số lớn nhất. Vì vậy, một FORCE INDEX(payment_date)
trên bảng thanh toán, tham gia sẽ giúp ích rất nhiều.
Đây là một ví dụ từ cơ sở dữ liệu thanh toán của bên thứ ba mà chúng tôi sử dụng tại nơi làm việc. Chúng tôi đã gặp vấn đề lớn với việc tối ưu hóa và FORCE INDEX hầu hết đã thực hiện công việc này. Thông thường, chúng tôi tìm thấy các lỗi chậm bằng mysqladmin, kiểm tra chúng bằng FORCE INDEX và gửi chúng đến nhà cung cấp để viết lại chúng trong mã nguồn của ứng dụng.
Dưới đây là bốn bảng để hiểu rõ hơn về ví dụ:
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;