我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的B-Tree索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。
MySQL InnoDB B-Tree索引使用Tips
这里主要讨论一下InnoDB B-Tree索引的使用,不提设计,只管使用。B-Tree索引主要作用于WHERE和ORDER BY子句。这里讨论的均在MySQL-Server-5.1.38测试
[php]
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);[/php]1.如果索引了多列,要遵守最左前缀法则。所谓最左前列,指的是查询从索引的最左前列开始,并且不跳过索引中的列。
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/ab8e92c58ecd57b3c75203db5eb68d2c.jpg)
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/553a85ad71d6e4c2287f98d01fdbd23b.jpg)
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/8148a50f81b42910847fa6fb84a23ce0.jpg)
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/a3fd5c476a204973973638e9d6d42eb0.jpg)
a)检查的行数过多,且没有使用覆盖索引。第3句,虽然跟第2句一样,order by使用了索引最左前列uid,但依然使用了filesort方式排序,因为status并不在索引中,所以没办法只扫描索引。
b)使用了不同的索引,MySQL每回只采用一个索引.第4句,order by出现二个索引,分别是uid_fuid和聚集索引(pk)c)对索引列同时使用了ASC和DESC。 通过where语句将order by中索引列转为常量,则除外。第5句,和第6句在order by子句中,都出现了ASC和DESC排序,但是第5句却使用了filesort方式排序,是因为第6句where uid取出排序需要的数据,MySQL将其转为常量,它的ref列为const。d)where语句与order by语句,使用了不同的索引。参见第8句。e)where语句或者ORDER BY语句中索引列使用了表达式,包括函数表达式。参见第9句f)where 语句与ORDER BY语句组合满足最左前缀,但where语句中使用了条件查询。查见第10句,虽然where与order by构成了索引最左有缀的条件,但是where子句中使用的是条件查询。g)order by子句中加入了非索引列,且非索引列不在where子句中。h)order by或者它与where组合没有满足索引最左前列。参见第11句和12句,where与order by组合,不满足索引最左前列. (uid, fsex)跳过了fuidi)当使用left join,使用右边的表字段排序。参见第13句,尽管user.uid是pk,依然会使用filesort排序。![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/8aff3b30345e79b6ae0b78992e96ead1.jpg)
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/ea92a78f90d61fc9bf3c25c59e2f1407.jpg)
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/d8d9a812a2bf03b62439fd4be242359c.jpg)
![p_460_001 MySQL索引 使用笔记](http://blog.hackroad.com/wp-content/uploads/2013/09/23ca4125c573af4e9e2b0ffbd531629e.jpg)
http://blog.hackroad.com/operations-engineer/db/3193.html