Mysql innodb引擎和myisam引擎使用索引區別
首先你要理解,innodb的主鍵索引都是聚簇索引,它的輔助索引裡面都包含有表的主鍵,
而且主鍵都在輔助索引的最後一列.而myisam的索引,都是普通索引,儲存的是列的值,
還有列在原表中的地址值---不儲存主鍵值.
好了,下面我們開始:
先建立兩個表:一個是innodb引擎的,一個是myisam引擎的
CREATE TABLE `innodb` ( `id` int(10) UNSIGNED NOT NULL, `a` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `myisam` (`id` int(10) UNSIGNED NOT NULL, `a` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`)) ENGINE=myisam DEFAULT CHARSET=latin1;
mysql> EXPLAIN SELECT * FROM innodb ORDER BY id /G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: pktest
type: INDEX------ innodb是聚簇索引,所以mysql直接掃描primary key並取出所有的欄位.需要用到primary key,此處直接掃描索引,而不需要查詢表,比ALL更快
possible_keys: NULL
KEY: PRIMARY ----由此可見,key的內容並不一定在possible keys中
key_len: 4
ref: NULL
rows: 6
Extra:---這裡為何不顯示為using index呢?
1 row IN SET (0.00 sec)
mysql> EXPLAIN SELECT * FROM myisam ORDER BY id /G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: myisam
type: ALL----- myisam是普通的索引,只是在索引中儲存了行的rowid,此索引的id列應該是有序的.但是通過id列去定位到原表的rowid,然後由rowid查詢表的所有欄位,會帶來大量的隨機讀.此時優化器選擇了直接讀取原表排序的方法,沒有利用任何索引.
possible_keys: NULL
KEY: NULL
key_len: NULL
ref: NULL
rows: 6
Extra: USING filesort---- 有filesort出現,全表掃描以後,再排序
1 row IN SET (0.00 sec)
mysql> EXPLAIN SELECT id FROM innodb WHERE a=3 /G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: innodb
type: ref
possible_keys: a
KEY: a
key_len: 5
ref: const
rows: 1
Extra: USING WHERE; USING INDEX---- 因為在這個表上有索引a,它包含了a列和id列,而且a列在前,id列在後,所以優化器只需要直接查詢該索引即可.所以會出現using index,因為直接用到了索引a,與原表無關
1 row IN SET (0.00 sec)
mysql> EXPLAIN SELECT id FROM myisam WHERE a=3 /G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: myisam
type: ref
possible_keys: a
KEY: a
key_len: 5
ref: const
rows: 1
Extra: USING WHERE---- 對myisam引擎,它依然用到了索引a,但是隻是通過索引a去查詢到行在原表中的rowid,然後根據rowid得出id列的值.所以這裡沒有useing index.歸根結底是因為myisam的索引不會儲存主鍵,所以不得不進行二次掃描
1 row IN SET (0.00 sec)
mysql> EXPLAIN SELECT id FROM innodb WHERE a=3 ORDER BY id /G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: innodb
type: ref
possible_keys: a
KEY: a
key_len: 5
ref: const
rows: 1
Extra: USING WHERE; USING INDEX; USING filesort---- 這 裡,同樣,在索引a中,含有(a,id)兩列,只需要查詢索引就ok了.
根據a=3得到需要的行,然後按照id排序.所以此處不應該出現 filesort,因為對於a,id列的排序,
直接再查詢一次primary key即可得出.所以這裡的key列處,應該是key: a, primary. 這樣效率會更高.
據說這是mysql 優化器的一個bug.以後會修復(在5.1.48已經沒有這種情況).
轉:http://blog.csdn.net/jiedushi/article/details/6528441
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26855487/viewspace-750280/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL儲存引擎:MyISAM和InnoDB的區別MySql儲存引擎
- Mysql引擎中MyISAM和InnoDB的區別有哪些?MySql
- MySQL儲存引擎--MyISAM與InnoDB區別MySql儲存引擎
- MySQL儲存引擎簡介及MyISAM和InnoDB的區別MySql儲存引擎
- MySQL的MyISAM和InnoDB引擎的主要區別是什麼?MySql
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎
- MySQL中MyISAM引擎與InnoDB引擎效能比較MySql
- MySQL之儲存引擎InnoDB和MyISAM的區別及底層詳解MySql儲存引擎
- MySQL 資料庫 InnoDB 和 MyISAM 資料引擎的差別MySql資料庫
- MySQL引擎介紹ISAM,MyISAM,HEAP,InnoDBMySql
- MySQL的MYISAM引擎的索引方式MySql索引
- MyISAM 儲存引擎,Innodb 儲存引擎儲存引擎
- MySQL MyISAM引擎和InnoDB引擎對於單表大小限制的總結MySql
- Mysql innodb引擎(一)緩衝和索引MySql索引
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- MySQL三種InnoDB、MyISAM和MEMORY儲存引擎對比MySql儲存引擎
- 資料庫系列:MySQL引擎MyISAM和InnoDB的比較資料庫MySql
- MySQL儲存引擎之MyIsam和Innodb總結性梳理MySql儲存引擎
- MySQL儲存引擎MyISAM與InnoDB的優劣MySql儲存引擎
- MyISAM與innoDB儲存引擎有何差別儲存引擎
- MySQL兩種儲存引擎: MyISAM和InnoDB 簡單總結MySql儲存引擎
- 【轉】Mysql兩種儲存引擎的異同【MyISAM和InnoDB】MySql儲存引擎
- InnoDB和MyISAM 區別(轉)
- InnoDB和MyISAM的區別
- MyISAM和InnoDB的區別
- 十八、Mysql儲存引擎並不只有MyISAM、InnoDB——精髓MySql儲存引擎
- 淺析InnoDB引擎的索引和索引原理索引
- MyISAM InnoDB 區別
- InnoDB和MyISAM區別總結
- Mysql中myisam和innodb的區別,至少5點MySql
- Mysql更換MyISAM儲存引擎為Innodb的操作記錄MySql儲存引擎
- MySQL5.1 MyISAM與InnoDB 引擎讀寫效能對比薦MySql
- MySQL資料庫MyISAM儲存引擎轉為Innodb的方法MySql資料庫儲存引擎
- MySQL中InnoDB引擎對索引的擴充套件MySql索引套件
- Innodb與MyISAM的區別
- MyISAM與InnoDB的區別
- Mysql innodb引擎(二)鎖MySql
- MySQL InnoDB儲存引擎MySql儲存引擎