在同一個數據庫我有一個表messages
whos列:id
,title
,text
我想要的。我只想要其中title
在表lastlogon
中沒有條目的記錄,其名稱相當於。從一個表格中去除另一個表格的值。超慢
我一直在使用PHP中的SQL命令,它通常花2-3秒拉起來:
SELECT DISTINCT * FROM messages WHERE title NOT IN (SELECT username FROM lastlogon) LIMIT 1000
這些都是好,直到表lastlogon
開始產生的約80%值表格messages
。消息有大約8000個條目,lastlogon大約有7000條。現在大約需要1分鐘到2分鐘才能完成。 MySQL會導致非常高的CPU使用率。
我嘗試以下,但沒有運氣減少時間:
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秒)
你有'lastlogon.username'上的索引嗎? – Clive
你可以包括解釋計劃嗎?我期待它會回答克萊夫的問題,說沒有索引,並且正在執行全表掃描。 – MatBailie
使用'lastlogon.username'是主鍵。而'messages'則有一個名爲'id'的單獨主鍵。 – ParoX