Mysql
 sql >> база данни >  >> RDS >> Mysql

Случаи на използване на MySQL `FORCE INDEX`?

Забелязах, че FORCE INDEX помага, когато имате множество обединения и подзаявки в полета VARCHAR, където както FK, така и реферираната стойност не са първичен ключ, като в същото време имате клауза where в поле 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:Индексът на колоната е извън обхвата, 0 <1

  2. Завършете урока за Soft Delete &Restore Laravel 8 за изтрити записи

  3. MySQL JOIN злоупотреба? Колко лошо може да стане?

  4. MySQL ORDER BY поле за дата, което не е във формат на дата

  5. MySQL ЗАРЕЖДАНЕ НА ДАННИ ЛОКАЛЕН ИНФАЙЛ Python