例如,我有以下查詢來獲取上個月提交的瀏覽次數最多的文章。通過查詢優化MySQL訂單
explain
SELECT *
FROM article
WHERE date > 1315391769
ORDER BY views DESC
LIMIT 10
如何爲此查詢選擇正確的索引?或者如何重新編寫它以避免掃描大量行或文件排序?
這是與當前的指標我想表方案:
CREATE TABLE `article` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(50) NOT NULL,
`body` text NOT NULL,
`date` int(32) NOT NULL,
`views` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `date` (`date`),
KEY `views` (`views`),
KEY `date_2` (`date`,`views`),
KEY `views_2` (`views`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=200003 ;
--
-- Dumping data for table `article`
--
INSERT INTO `article` VALUES (1, 'title test113', 'test body118', 1317912183, 5017);
INSERT INTO `article` VALUES (2, 'title test193', 'test body193', 1313441124, 5943);
INSERT INTO `article` VALUES (3, 'title test112', 'test body116', 1312773586, 653);
INSERT INTO `article` VALUES (4, 'title test378', 'test body374', 1316786646, 4589);
INSERT INTO `article` VALUES (5, 'title test335', 'test body3310', 1319173694, 6224);
注意:我也嘗試過MySQL的日期,而不是Unix時間戳,但我得到了同樣的結果。
這是解釋輸出:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE article range date,date_2 date 4 NULL 107245 Using where; Using filesort
@我貼只有5行作爲樣本。 –
什麼是int(32)?這是否有點簽署更大的整數?就此而言,什麼是int(11)? http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html –
它應該是11不是32.我已經改變它到MySQL時間和MySQL日期時間,我得到了同樣的結果。 –