mysql中using where,using index

  1. Using where:過濾元素;html

    執行 explain SELECT * from test where  b = '4'    (b不是索引,全表掃描後,經過過濾獲取所需數據)oop

 

   執行 explain SELECT * from test where  c = '4'    (c是索引,經過索引定位到所需數據,不需過濾)優化

  1. Using index:查詢使用索引就能直接訪問索引文件獲取到所須要的數據;htm

    執行  explain SELECT c from test where  c = '4' (c是索引)blog

  1. Using index condition:查詢使用索引,但要訪問數據文件(表數據)才能獲取所須要的數據;排序

  2. using firesort : order by時,在索引加得不當的狀況下,都有可能出現Using filesort,這時候就要對SQL語句和索引進行優化了(我的理解:排序字段不是索引或排序字段是索引但沒有用到就會出現using filesort)索引

  3. using jion buffer(block nested loop):it

示例表io

CREATE TABLE `test` (
  `a` varchar(20) NOT NULL,
  `b` varchar(20) DEFAULT NULL,
  `c` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;table

CREATE TABLE `prov` (
  `id` varchar(32) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `height` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


執行

SELECT  * FROM test t INNER JOIN prov v on t.c = v.id where v.id <'4';

說明:

從執行計劃中看出v是基表,在查詢中使用到了主鍵v.id,Extra是using where(由於過濾條件v.id<'4',即查詢優化器先定位到 v.id='4'的記錄,再查找符合要求的數據,從執行計劃能夠看出符合要求有3條數據,此爲索引回表查詢過程),t表中row=5,由於t.c不是索引,因此基表v的每條符合要求記錄 與t表關聯查詢時t表都是全表掃描,因此Extra是using join buffer。

執行 ALTER table test add index inx_c(c) ,給t.c加索引,執行計劃以下:

Extra是using index condition, 由於select *   是要讀到表數據,可是使用了索引

執行 SELECT c from test where c = '5';

Extra是using index , 由於select c  查找時使用了索引,只從索引中就可獲得數據,不用訪問表數據

 

執行 SELECT  * FROM  test t INNER JOIN prov v on t.a = v.id where v.id <'4';

t表中row=1,由於t.a是主鍵,因此基表v的每條符合要求記錄 與t表關聯查詢時是經過索引直接定位到符合要求的數據。

參考:http://blog.sina.com.cn/s/blog_5037eacb0102vkcp.html

相關文章
相關標籤/搜索