В той же базе данных у меня есть таблица messages
, чьи столбцы: id
, title
, text
Я хочу.Я хочу, чтобы только записи, в которых title
не имеет записей в таблице lastlogon
, чей эквивалент названия затем называется username
.
Я использовал эту команду SQL в PHP, обычно это занимало 2-3 секунды, чтобы подтянуть:
SELECT DISTINCT * FROM messages WHERE title NOT IN (SELECT username FROM lastlogon) LIMIT 1000
Все это было хорошо, пока таблица lastlogon
не начала иметь около 80% таблицы значений messages
.Сообщения содержат около 8000 записей, последний - около 7000. Теперь для их прохождения требуется от минуты до двух минут.MySQL работает с очень высокой загрузкой ЦП.
Я попробовал следующее, но безуспешно сократил время:
SELECT id,title,text FROM messages a LEFT OUTER JOIN lastlogon b ON (a.title = b.username) LIMIT 1000
Почему вдруг это требуеттак долго для такого низкого количества записей?Я попытался перезапустить MySQL и Apache несколько раз.Я использую Debian Linux.
Редактировать: Вот структуры
--
-- Table structure for table `lastlogon`
--
CREATE TABLE IF NOT EXISTS `lastlogon` (
`username` varchar(25) NOT NULL,
`lastlogon` date NOT NULL,
`datechecked` date NOT NULL,
PRIMARY KEY (`username`),
KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `messages`
--
CREATE TABLE IF NOT EXISTS `messages` (
`id` smallint(9) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`email` varchar(50) NOT NULL,
`text` mediumtext,
`folder` tinyint(2) NOT NULL,
`read` smallint(5) unsigned NOT NULL,
`dateline` int(10) unsigned NOT NULL,
`ip` varchar(15) NOT NULL,
`attachment` varchar(255) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`username` varchar(300) NOT NULL,
`error` varchar(500) NOT NULL,
PRIMARY KEY (`id`),
KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9010 ;
Редактировать 2
Отредактированная структура с новыми индексами.После добавления индекса для messages.title и lastlogon.username я получил следующие результаты:
Отображение строк 0–29 (всего 623, запрос занимал 74,4938 с)