MySQL的Explain命令用於查看執行效果。雖然這個命令只能搭配select類型語句使用,如果你想查看update,delete類型語句中的索引效果,也不是太難的事情,只要保持條件不變,把類型轉換成select就行了。
explain的語法如下:
explain [extended] select ... from ... where ...
如果使用了extended,那麼在執行完explain語句後,可以使用show warnings語句查詢相應的優化信息。
mk-visual-explain工具擴展了explain,它提供了一種更直觀的樹形表現形式,使用方法很簡單:
mk-visual-explain <file_containing_explain_output>
mk-visual-explain -c <file_containing_query>
mysql -e "explain select * from MySQL.user" | mk-visual-explain
也可以在MySQL命令行裡通過設置pager的方式來執行:
MySQL> pager mk-visual-explain
MySQL> explain [extended] select ... from ... where ...
進入正題,為了讓例子更具體化,我們先來建一個表,插入一點測試數據:
CREATE TABLE IF NOT EXISTS `article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author_id` int(10) unsigned NOT NULL,
`category_id` int(10) unsigned NOT NULL,
`vIEws` int(10) unsigned NOT NULL,
`comments` int(10) unsigned NOT NULL,
`title` varbinary(255) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `article`
(`author_id`, `category_id`, `vIEws`, `comments`, `title`, `content`) VALUES
(1, 1, 1, 1, '1', '1'), (2, 2, 2, 2, '2', '2');
CREATE TABLE IF NOT EXISTS `article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author_id` int(10) unsigned NOT NULL,
`category_id` int(10) unsigned NOT NULL,
`vIEws` int(10) unsigned NOT NULL,
`comments` int(10) unsigned NOT NULL,
`title` varbinary(255) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `article`
(`author_id`, `category_id`, `vIEws`, `comments`, `title`, `content`) VALUES
(1, 1, 1, 1, '1', '1'),(2, 2, 2, 2, '2', '2');
缺省只建了一個主鍵,沒有建其他的索引。測試時,如果你時間充裕,應該盡可能插入多一點的測試數據,怎麼說也應該保證幾千條。如果數據量過少,可能會影響MySQL在索引選擇上的判斷。如此一來,一旦產品上線,數據量增加。索引往往不會按照你的預想工作。
下面讓我們設置一個任務:查詢category_id為1且comments大於1的情況下,vIEws最多的article_id。
問題很簡單,SQL也很簡單:
SELECT author_id
FROM `article`
WHERE category_id = 1 AND comments > 1
ORDER BY vIEws DESC
LIMIT 1
SELECT author_id
FROM `article`
WHERE category_id = 1 AND comments > 1
ORDER BY vIEws DESC
LIMIT 1
下面讓我們用explain命令查看索引效果: