mysql查詢用不用索引疑問


一、單表查詢索引列和查詢索引列+其他非索引列  查詢數據速度為什么有差?為什么查詢非索引列會不走索引?

現象: 單個表,結構如下:

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 沒加排序,也沒用到索引,全表掃描了。行數也對應增加了許多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM