一、單表查詢索引列和查詢索引列+其他非索引列 查詢數據速度為什么有差?為什么查詢非索引列會不走索引?
現象: 單個表,結構如下:
CREATE TABLE `t_attach_new` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`fname` varchar(100) NOT NULL DEFAULT '',
`ftype` varchar(50) DEFAULT '',
`fkey` text NOT NULL,
`authorId` int(10) DEFAULT NULL,
`created` int(10) NOT NULL,
`hash` varchar(255) DEFAULT NULL,
`web_url` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fname` (`fname`),
KEY `created` (`created`),
KEY `id` (`id`,`created`),
KEY `created_2` (`created`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2621401 DEFAULT CHARSET=utf8;
查詢語句,下面兩個。
EXPLAIN SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;
EXPLAIN SELECT id,fname FROM t_attach_new LIMIT 2000000,10;
為什么掃描行數一樣,第一個沒用索引,第二個用了呢?
第一個是直接掃描的所有數據行,並且沒用到主鍵索引,但是和用到主鍵索引一樣返回的相同的數據行(看下面的二可以清晰看到區別)
第二個是直接用了fname這個索引,但是返回的數據行與第一個不一致。
返回的數據
SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;
SELECT id,fname FROM t_attach_new LIMIT 2000000,10;
補充 explain type類型:
二、接着看一下這三個查詢的區別,看看怎么才用到索引
EXPLAIN SELECT id,fname,web_url FROM t_attach_new ORDER BY id LIMIT 2000000,10;
EXPLAIN SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;
EXPLAIN SELECT id,fname FROM t_attach_new ORDER BY id LIMIT 2000000,10;
可以看出,1,3 加了order by 的查詢直接用主鍵索引了。2 沒加排序,也沒用到索引,全表掃描了。行數也對應增加了許多。