2011-10-27 152 views
1

例如,我有以下查詢來獲取上個月提交的瀏覽次數最多的文章。通過查詢優化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 
+0

@我貼只有5行作爲樣本。 –

+0

什麼是int(32)?這是否有點簽署更大的整數?就此而言,什麼是int(11)? http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html –

+0

它應該是11不是32.我已經改變它到MySQL時間和MySQL日期時間,我得到了同樣的結果。 –

回答

1

單個鍵date_2dateviews)應該給用於所討論的查詢最佳性能。見here我不認爲其他指標會幫助。由於查詢非常簡單,我無法想象任何其他優化!

+0

不,user_ksa是正確的。可以使用'(日期)'或'(視圖)'索引。 –

1

對於此類查詢,只能使用(date)(views)索引,而不能使用索引(date,views)。 MySQL選擇使用什麼可能是最優的也可能不是最優的。 2月份的最優數據可能不會用於4月份的數據!

  • 您可以嘗試強制其中的一種測量性能。

  • 您可以與Year-Month數據添加計算的列,使用CHAR(6)201104爲2011年4月(即列可以使用INSERT和UPDATE觸發器被更新)或者int24136(24136 = 2011×12 + 4)。

那麼你的條件是:

WHERE YearMonth = '201109'   --- for September 

WHERE YearMonth = 2011*12+9  

,並且可以使用(YearMonth, views)指數。

1

通過強制指數實現。

explain 
SELECT * 
FROM article force index (`views`) 
WHERE date>=1315391768 
ORDER BY views DESC 
LIMIT 10 

解釋計劃:

"id" "select_type" "table"  "type"  "possible_keys" "key" "key_len"  "ref" "rows" "Extra" 
"1" "SIMPLE"  "article" "index"   \N   "views" "4"   \N "5" "Using where"