http://www./?p=460MySQL索引 使用筆記我們平常所說的索引,如果沒有特別指明,都是指B+樹結(jié)構(gòu)組織的B-Tree索引(http://blog.csdn.net/michaelrun/article/details/5617832)。其中聚集索引,次要索引,覆蓋索引,復(fù)合索引,前綴索引,唯一索引默認都是使用B+樹索引,統(tǒng)稱索引。當然,除了B+樹這種類型的索引之外,還有哈稀索引(hash index)等。 MySQL InnoDB B-Tree索引使用Tips這里主要討論一下InnoDB B-Tree索引的使用,不提設(shè)計,只管使用。B-Tree索引主要作用于WHERE和ORDER BY子句。這里討論的均在MySQL-Server-5.1.38測試 CREATE TABLE `friends` ( `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `uid` bigint(20) UNSIGNED NOT NULL DEFAULT '0', `fuid` bigint(20) UNSIGNED NOT NULL DEFAULT '0', `fname` varchar(50) NOT NULL DEFAULT '', `fpicture` varchar(150) NOT NULL DEFAULT '', `fsex` tinyint(1) NOT NULL DEFAULT '0', `status` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; ALTER TABLE `friends` ADD INDEX uid_fuid (uid, fuid); 1.如果索引了多列,要遵守最左前綴法則。所謂最左前列,指的是查詢從索引的最左前列開始,并且不跳過索引中的列。 a)檢查的行數(shù)過多,且沒有使用覆蓋索引。第3句,雖然跟第2句一樣,order by使用了索引最左前列uid,但依然使用了filesort方式排序,因為status并不在索引中,所以沒辦法只掃描索引。 b)使用了不同的索引,MySQL每回只采用一個索引.第4句,order by出現(xiàn)二個索引,分別是uid_fuid和聚集索引(pk) c)對索引列同時使用了ASC和DESC。 通過where語句將order by中索引列轉(zhuǎn)為常量,則除外。第5句,和第6句在order by子句中,都出現(xiàn)了ASC和DESC排序,但是第5句卻使用了filesort方式排序,是因為第6句where uid取出排序需要的數(shù)據(jù),MySQL將其轉(zhuǎn)為常量,它的ref列為const。 d)where語句與order by語句,使用了不同的索引。參見第8句。 e)where語句或者ORDER BY語句中索引列使用了表達式,包括函數(shù)表達式。參見第9句 f)where 語句與ORDER BY語句組合滿足最左前綴,但where語句中使用了條件查詢。查見第10句,雖然where與order by構(gòu)成了索引最左有綴的條件,但是where子句中使用的是條件查詢。 g)order by子句中加入了非索引列,且非索引列不在where子句中。 h)order by或者它與where組合沒有滿足索引最左前列。參見第11句和12句,where與order by組合,不滿足索引最左前列. (uid, fsex)跳過了fuid i)當使用left join,使用右邊的表字段排序。參見第13句,盡管user.uid是pk,依然會使用filesort排序。
附件1. MySQL Explain, 這里附一份由網(wǎng)友胡中泉分享的Explain的PPT,我認為寫得很好 |
|