Как оптимизировать sql запрос, чтобы заработали индексы?
Имеется sql запрос:
SELECT *
FROM board
WHERE id IN (SELECT board_id
FROM board_category
WHERE cat_id='24')
AND city_id='1'
AND status = '1'
AND activation = '1'
AND del = '0'
ORDER BY (timeupdate) DESC,
id DESC
LIMIT 18 OFFSET 0
Его Explain - https://yadi.sk/i/4FtVuEtjMtUCCQ
Индекс - CREATE UNIQUE INDEX cti2 ON board(timeupdate, id, city_id, status, activation, del); не работает.
Какой нужно создать индекс или как переписать sql запрос, чтобы была быстрая выборка?
В таблице board 400к+ записей (тип MyISAM), в таблице board_category больше миллиона записей (тип InnoDB).
UPD
если сделать так
`SELECT *
FROM board
JOIN board_category ON board.id = board_category.cat_id
WHERE board_category.cat_id = '24'
AND board.city_id = '1'
AND board.STATUS = '1'
AND board.ACTIVATION = '1'
AND board.del = '0'
ORDER BY board.timeupdate DESC
,board.id DESC LIMIT 20 `
то также долго выполняется (2.5 секунды). Explain https://yadi.sk/i/xnCUHKEgWTilsw
UPD 2 Структура таблиц
CREATE TABLE IF NOT EXISTS `board` (
`id` int(11) auto_increment,
`user_id` int(11) NOT NULL,
`cat_id` varchar(250) NOT NULL,
`name` varchar(250) NOT NULL,
`translate` varchar(250) NOT NULL,
`text` varchar(15000) NOT NULL,
`email` varchar(64) NOT NULL,
`phone` varchar(20) NOT NULL,
`person` varchar(250) NOT NULL,
`region_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`address` varchar(500) NOT NULL,
`price` varchar(11) NOT NULL,
`photo` varchar(500) NOT NULL,
`time` int(11) NOT NULL,
`timeupdate` int(11) NOT NULL,
`timesrok` int(11) NOT NULL,
`status` enum ('1','2') NOT NULL default '2',
`activation` enum ('1','2') NOT NULL default '1',
`torg` enum ('0','1') NOT NULL default '0',
`free` enum ('0','1') NOT NULL default '0',
`urgent` enum ('0','1') NOT NULL default '0',
`vip` enum ('0','1') NOT NULL default '0',
`viptime` int(11) NOT NULL,
`select` enum('0','1') NOT NULL DEFAULT '0',
`selecttime` int(11) NOT NULL,
`confirm` enum('0','1') NOT NULL DEFAULT '0',
`sendemail` enum('0','1') NOT NULL DEFAULT '0',
`type` enum('1','2') NOT NULL default '1',
`del` enum('0','1') NOT NULL DEFAULT '0',
`file` enum('0','1') NOT NULL DEFAULT '0',
`views` int(11) NOT NULL default '0',
`url` varchar(2000) NOT NULL,
`cityname` varchar(100) NOT NULL,
`citytr` varchar(100) NOT NULL,
`lat` varchar(11) NOT NULL,
`lng` varchar(11) NOT NULL,
`rating` varchar(11) NOT NULL default '0',
`ratingcount` int(11) NOT NULL default '0',
`parser` int(1) NOT NULL default '0',
`update` int(1) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;**
CREATE TABLE IF NOT EXISTS `board_category` (
`user_id` int(11) NOT NULL,
`cat_id` int(11) NOT NULL,
`board_id` int(11) NOT NULL,
KEY `user_id` (`user_id`),
KEY `cat_id` (`cat_id`),
KEY `board_id` (`board_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
UPD 3
Запрос все равно медленно работает, хоть и есть индекс CREATE UNIQUE INDEX cat_cityv2 ON board(timeupdate, id, cat_id, city_id, status, activation, del); который используется https://yadi.sk/i/Yv-If5jTbJlBuQ
SELECT board.*
,(
SELECT COUNT(*)
FROM board_favorites
WHERE board_favorites.board_id = board.id
AND user_id = '1'
) AS countfav
FROM board
WHERE cat_id IN (
2
,24
,29
)
AND city_id = 2
AND STATUS = '1'
AND ACTIVATION = '1'
AND del = '0'
ORDER BY (timeupdate) DESC
,id DESC LIMIT 18 OFFSET 0