MySQL中的索引

 

通俗简单:http://blog.csdn.net/xluren/article/details/32746183html

文字比较:http://www.cnblogs.com/yuan-shuai/p/3225417.htmlnode

树形解释:http://www.cnblogs.com/shijingxiang/articles/4743324.htmlmysql

知识面比较全:http://www.cnblogs.com/lyhabc/p/3776739.htmlsql

index与key:http://www.cnblogs.com/chyong168/archive/2011/12/19/2293140.htmlhttp://zccst.iteye.com/blog/1697043http://blog.csdn.net/nanamasuda/article/details/52543177数据库

 

怎么判断一个 mysql 中 select 语句是否使用了索引,能够在 select 语句前加上 explain, 好比 explain select * from tablename;返回的一列中,若列名为 key 的那列为 null,则没有使用索引,若不为 null,则返回实际使用的索引名。让 select 强制使用索引的语法:select * from tablename from index(index_name);数据结构

 

索引(B-树,B+树),通常来讲,应该在这些列上加索引:1)常常须要搜索的列,加 快搜索速度 2)第做为主键的列,强制该列的惟一性 3)在常常用在链接的列上,这些列主要是外键,能够加快链接速度 4)在常常须要根据范围进行搜索的列上建立索引,由于索引已经排序,指定的范围是连续的 5)在常常须要排序的列上。函数

惟一索引:不容许其中任何两行有相同的值。spa

主键索引:为表定义主键自动建立主键索引,是惟一索引的特定类型:.net

汇集索引:b-树中一次检索最多须要 h-1 次 io(根节点常驻内存,h 为树的高度),通常用磁盘 io 来评价索引的优劣,b 树中一个节点对应一页,因此一个 node 只要一次 io。指针

联合索引:两个或多个列上的索引被称为联合索引。

 

mysq 索引使用的是 B+的数据结构

索引:用于提升数据访问速度的数据库对象。

优势:1)索引能够避免全表扫描;2)对于非汇集索引,有些查询甚至能够不访问数据项;3)汇集索引能够避免数据插入操做集中于表的最后一个数据页;4)一些状况下,索引还能够避免排序。

缺点:1)建立和维护索引要耗费时间。2)索引须要占用物理空间,除了数据表占数据空间之外,每个索引还要占物理空间。3)当对表中数据进行增长、删除和修改时, 索引也要动态维护,这样就下降了数据的维护速度。

 

聚簇索引/非聚簇索引

聚簇索引:数据按索引顺序存储,叶子节点存储真实的数据行,再也不有另外单独的数据页。在一张表上只能建立一个聚簇索引,由于真实数据的物理顺序只能有 1 种。

使用聚簇索引的场合:

1)某列包含小数目的不一样值。

2)排序和范围查找。

上图是聚簇索引主键索引的状况。若是在col2上构建辅助索引,是以下图的:

由上图能够看出辅助索引须要检索两遍索引:首先检索辅助索引得到主键,而后用主键到主索引中检索得到记录。

使用非聚簇索引的场合:

1)某列包含大数目的不一样值。

2)频繁更新的列。

 上图是非聚簇索引主键索引的状况,若是在col2上构建一个辅助索引,结构与上图是如出一辙的。

非聚簇索引与汇集索引的区别:

1)叶子节点并不是数据节点,叶子节点为每个真正的数据行存储一个“键-指针”对,根据页指针及指针偏移能够定位到具体的数据行

2)在除叶节点外的其余索引节点,存储的是相似内容,只不过是指向下一级索引页。

3)聚簇索引记录的物理顺序和索引的排列顺序一致;非聚簇索引记录的物理顺序和索引的排列顺序不一致。

4)聚簇索引插入记录时需在数据页中进行数据重排;非聚簇索引不会引发数据重排。

 

联合索引

mysql 每次查询,只能用一个索引。

若咱们建立了(A,B,C)的复合索引,那么其实至关于建立了(A,B,C)、(A,B)、(A)三个索引,这被称为最佳左前缀特性。在建立复合索引时,应将最经常使用的放在最左边。

对于组合索引(A, B, C)的查询使用场景:

1)当第一列和第二列使用等值查询时,可使用所有组合索引(A, B, C)。例如:A=5 AND B=6 AND C>8

2)当第一列使用等值查询,第二列使用范围查询时,仅使用前两列索引条件(A, B)。例如:A=5 AND B>6 AND C=9

3)当第一列使用范围查询时,仅能使用第一列索引条件(A)。例如:A>5 AND B =2 AND C=9

4)当查询条件不包含第一列时,不能用到任何组合索引。例如:B=6 AND C=9

对于组合索引(A, B, C)的排序索引不能使用场景:

1)排序在索引的第二列。例如:ORDER BY B

2)范围查询在第一列,排序在第二列。例如:A>5 ORDER BY B

 

下列事件索引会失效:1)条件中有 or,即便其中有条件带索引也不会使用(要想使用

or 又想让索引生效,只能将 or 条件中每一个列加上索引)2)like 查询,以%开头 3)若列类型为字符串,则必定要在条件中将数据用引号引发来,不然不使用索引 4)若 mysql 估计使用全表扫描要比索引快,则不使用索引 5)对索引进行运算致使索引列失效 6)使用内部函数致使索引失效,这样应当建立基于函数的索引 7)b-树,is null 不会用,is not null 会用。

相关文章
相关标签/搜索