如果索引了多列(联合索引),要遵循最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,,并且不跳过索引中的列,如果跳跃某一列索引将部分失效(后面的字段索引失效)。
例如,建立了一个联合索引依次连接了a,b,c字段,查询b若需用到这个索引,则a必须查询,要查询c,a和b必须查询。查询的顺序无关,存在即可。(必须查询指在SQL的条件限制语句中应存在)
联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。
解决方案:使用>=,<=代替>,<。
在索引列上进行运算操作,索引将失效。
如果仅仅是尾部抹灰匹配,索引不会失效。如果是头部模糊匹配,索引失效。
用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么设计的索引都不会被用到。
此图id为主键,没有为age建立索引。
此图为age建立索引,查询。
如果MySQL评估使用索引比全表扫描更慢,则不适用索引。
SQL提示,是优化数据库的一个重要手段,简单来说就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
use index()是给出建议,具体使用还要看MySQL分析的情况,可能不接受建议,force是强制使用。
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *。
查询索引中没有的数据,需要回表查询。
当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
·语法:
create index idx_xxx on table_name (column(n));
其中column(n)中的column代表字段名,n代表前n个字符。
·前缀长度:
可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
查询过程:
查询的语法与平常无异,但查询过程略有出入。
以此为例,先前已经建立了长度为5的email前缀索引。查询先是在前缀索引中找到 lvbu6所对应的主键ID,再回表到主键索引(此表主键索引为聚集索引)找到对应行数据,根据行数据找到email进行对比,与查询的[email protected]相同即返回行数据。之后再在前缀索引中比对下一个节点是不是lvbu6,若是,则按相同步骤找到行数据返回,再看下一个节点数据,依次重复直到下个节点数据不是lvbu6,不是则查询终止。