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.html,http://zccst.iteye.com/blog/1697043,http://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 会用。