MySQL使用索引的场景和实际使用索引的SQL类型有关。为关系数据表中的某些字段建立索引可以大大提高查询速度(当然,不同字段是否有选择性会导致这些字段建立的索引提高查询速度的方式不同,索引越多越好,因为索引信息需要写入或删除时更新)。对于MySQL的Innodb存储引擎,大部分类型的索引都存储在B+Tree中,B+Tree是B-Tree数据结构的变种(MEMORY类型的表也支持hash类型的索引)。B-Tree是一种常用于数据库或文件系统的数据结构。它是一棵N叉平衡树。这种树结构保证了存储在同级节点中的键是有序的。对于一个节点,其左子树中保存的所有键都小于该节点中保存的键,其右子树中保存的所有键都大于该节点中保存的键。另外,在工程实现上,结合操作系统的局部性原理,做了很多优化。总之,b-tree的各种特性或优化技术可以保证:1)查询磁盘记录时,磁盘读取次数最少;2)任何插入和删除操作对树结构影响很小;3)树本身的rebalance操作非常高效。2、MySQL使用索引的场景MySQL在以下运行场景中使用索引:1)快速查找满足where条件的记录2)快速确定候选集。如果where条件使用了多个索引字段,MySQL会优先使用能够最小化候选记录集大小的索引,以尽快淘汰不符合条件的记录。3)如果表中存在由多个字段组成的联合索引,在查找记录时,也会自动将联合索引最左边的前缀匹配字段作为索引,以加快查找速度。例如,如果为一个表创建一个由3个字段(c1,c2,c3)组成的联合索引,则(c1),(c1,c2),(c1,c2,c3)将作为索引,而(c2,c3)不会被用作索引,而(c1,c3)实际上只使用c1索引。4)连接多个表时会用到索引(如果参与连接的字段在这些表中有索引)5)如果一个字段已经被索引,在查找该字段的min()或max()时,MySQL会使用索引6)MySQL在对索引字段进行排序或分组操作时会使用索引3.哪些SQL语句会真正使用索引可以从MySQL官网文档《B-Tree和Hash索引的比较》中得知,以下类型SQL可能实际使用索引:1)B-Tree可用于比较SQL中的表达式,例如=、>、>=、<、<=和操作之间2)如果like语句的条件它是不以通配符开头的常量字符串,MySQL也会使用索引。例如SELECT*FROMtbl_nameWHEREkey_colLIKE'Patrick%'或者SELECT*FROMtbl_nameWHEREkey_colLIKE'Pat%_ck%'可以使用索引,而SELECT*FROMtbl_nameWHEREkey_colLIKE'%Patrick%'(以a开头wildcard)和SELECT*FROMtbl_nameWHEREkey_colLIKEother_col(like条件不是常量字符串)不能使用索引。对于LIKE'%string%'形式的SQL语句,如果通配符后面的字符串长度大于3,MySQL会使用TurboBoyer-Moore算法进行查找。3)如果在名为col_name的列上建立了索引,"col_nameisnull"形式的SQL将使用该索引4)对于联合索引,sql条件中的最左前缀匹配字段将使用该索引,请参考例子参考本文第3条第2节联合索引的描述5)如果SQL语句中有多个where条件,MySQL会进行IndexMerge优化,缩小候选集范围。博文来源:http://blog.csdn。净/pcyph/文章/细节/45825533
