У меня есть php-запрос, который выполняется довольно часто, как этот:
$query = 'SELECT * FROM work_orders '
.'WHERE '
. "((end_time >= ?"
. "AND start_time <= ?) "
. "OR (start_time <= ? "
. "AND end_time >= ? ) "
. "OR (start_time >= ? "
. "AND end_time <= ? )) ";
И таблица определяется как:
CREATE TABLE IF NOT EXISTS `work_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`work_order_number` varchar(32) COLLATE latin1_general_ci NOT NULL,
`start_time` datetime NOT NULL,
`end_time` datetime NOT NULL,
`client_name` varchar(128) COLLATE latin1_general_ci NOT NULL,
`location` varchar(128) COLLATE latin1_general_ci NOT NULL,
`note` varchar(255) COLLATE latin1_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `note_idx` (`note`),
KEY `client_idx` (`client_name`),
KEY `location_idx` (`location`),
KEY `start_time_idx` (`start_time`),
KEY `end_time_idx` (`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
Меня часто смущает, как мне создавать индексы. Это таблица с интенсивным чтением с большим поиском в данных, поэтому я индексирую каждый столбец, но наиболее часто выполняемый запрос использует 3 комбинации даты начала и окончания, чтобы определить, попадает ли рабочее задание в конкретный календарный ряд. Должен ли я иметь индексы start_time и end_time по отдельности, как я делаю в настоящее время, или я должен создать составной ключ из двух? Есть ли лучший способ настроить индексы в целом? Должен ли я даже использовать InnoDB? Я вообще не использую транзакции.