MySql(一) 浅析MySql索引

一、简介

      索引在数据库中用来提升查询的效率(相似新华字典的偏旁部首检索),能够避免全表扫描查询,索引也会占用数据库资源,避免滥用。算法

二、索引创建的原则
  • 较频繁的做为查询条件的字段应该建立索引
  • 惟一性太差的字段不适合单首创建索引,即便频繁做为查询条件
  • 更新很是频繁的字段不适合建立索引(数据库会将索引数据根据算法排序,数据量大以后从新排序会占用过多资源)
  • 用于索引的最好的备选数据列是那些出如今WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。

三、复合索引的创建以及最左前缀原则
数据库

       惟一性太差又常常做为查询条件的字段能够创建复合索引,假设在USER表的name、salary和city数据列上创建了复合索引。索引中的数据行按照name/salary/city次序排列,因此即便你在查询中只指定了name值,或者指定name和salary值,MySQL也可使用这个索引。所以,这个索引能够被用于搜索以下所示的数据列组合:
name,salary,city
name,city
name,salary
name
在实际使用中发现:

1)2,1也是用到了索引的,这里可能你们会疑惑违背了最左前缀原则。其实这是由于把where后条件反过来变成name='aa' and salary=300获得的查询结果是同样的。这时MySql的查询优化器会判断这条语句执行效率最高的执行顺序,最后生成真正的执行计划,因此最后MySql会以name='aa' and salary=300这种顺序查询,这就用到了索引。bash

2)这两种状况都用到了索引,彷佛有点出乎预料。这里是由于能够直接从索引里返回查询记录,因此用到了索引全扫描,实际扫描的行数为所有行数。但并无进行全表扫描,仍是用到了索引。数据结构

四、索引类型
  • 惟一索引:不容许两行具备相同的索引值(主键索引是惟一索引的特殊类型)
  • 汇集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序,每一个表只能有一个
  • 非汇集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不一样。 索引是经过二叉树的数据结构来描述的,能够理解为汇集索引的叶节点就是数据节点。而非汇集索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
五、执行计划explain中type类型
  • null: MySQL不访问任何表或索引,直接返回结果
  • ALL:全表扫描
  • index: 索引全扫描
  • range: 索引范围扫描,用于<,<=,>=,between等操做
  • ref: 使用非惟一索引扫描或惟一索引前缀扫描,常出如今关联查询中
  • eq_ref : 相似ref,区别在于使用的是惟一索引,使用主键的关联查询
  • const:使用主键查询时出现,表明系统会把匹配行中的其余列做为常数处理(最优状况)



写博客是为了加深本身的一些理解,若是有错误的地方欢迎指正,你们互相交流。复制代码
相关文章
相关标签/搜索