索引的原理
参考:http://blog.csdn.net/iefreer/article/details/15815455索引的分类:
normal:表示普通索引
unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
怎么合理利用索引首先利用EXPLAIN分析Mysql是如何处理查询语句,和表之间是如何关联的,并且以什么次序联合。
参数解释:
id:查询的序列号
select_type:查询的类型,包括普通查询(SIMPLE),联合查询,子查询
table:所访问的数据库中表的名称
type:联合查询使用的类型
possible_keys:指出MySQL能使用哪个索引在该表中找到该行,如果这个值是空的,则表示没有相关的所有。
这时要提高性能,可通过检查where子句,看是否引用了哪些字段,或检查字段是否适合索引。
key:显示MySQL实际决定使用的键。如果没有索引被选中,键是NULL
key_len:显示MySQL决定使用的键长度。如果键是null,长度就是null。
ref:显示哪个字段或常熟与key一起被使用
rows:这个值表示mysql要遍历多少数据才能找到所需的结果集,其在innodb上是不准确的
extra:
using where :表示用了where限制
using filesort :一般在用order by 或 group by 排序时出现,意思是无法用索引进行排序,不得不使用相应的算法进行排序。当出现这个时候,说明有问题,要优化。
using temporary :使用临时表,一般在用order by 或 group by 排序时出现。
其中type显示的类型是重要的指标,结果值从好到坏依次是:system(系统表),const(常量),eq_ref(最多一条匹配结果,通常是通过主键访问)、ref(被驱动表索引引用)、fulltext(全文索引检索)、ref_or_null(带空值的索引查询)、index_merge(合并索引结果集)、unique_subquery(子查询中返回的字段是唯一组合或索引)、index_subquery(子查询返回的是索引,但非主键)、range(索引范围扫描)、index(全索引扫描)、ALL(全表扫描)。
一般来说,保证查询至少达到range级,最好能达到reg级。ALL是全表扫描,是最坏的情况,这种情况往往是没用上索引。
注意:
1、每个表的索引应在5个一下
2、当查询需要连接多表时,避免连接只有不到7条数据的表,否则当使用order by 或group by 进行排序时,该表的索引会失效,extra会显示using filesort 。