MySQL中的索引

 

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

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

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

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

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)在经常需要排序的列上。

唯一索引:不允许其中任何两行有相同的值。

主键索引:为表定义主键自动创建主键索引,是唯一索引的特定类型:

聚集索引: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 会用。

posted on 2018-03-26 17:21  二十年后20  阅读(227)  评论(0编辑  收藏  举报

导航