关于sql索引的分享

一、什么是索引? 索引是一种存储引擎用于快速查找记录的数据结构html


二、索引的类型和方法 根据数据库的功能,能够在数据库设计器中建立四种索引:非汇集索引(惟一索引、非惟一索引、主键索引)和汇集索引。 尽管惟一索引有助于定位信息,但为得到最佳性能结果,建议改用主键或惟一约束。 (1)惟一索引 :惟一索引是不容许其中任何两行具备相同索引值的索引 (2)非惟一索引 : 非惟一索引是相对惟一索引,容许其中任何两行具备相同索引值的索引 (3)主键索引 : 数据库表常常有一列或列组合,其值惟一标识表中的每一行 思考:主键和惟一索引有什么区别? (4)汇集索引 : 在汇集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个汇集索引。 思考:非汇集索引和汇集索引有什么区别?mysql

汇集索引:表数据是按照索引的顺序来存储的,也就是说,索引项的顺序与表中记录的物理顺序一致。对于汇集索引,叶子结点即存储了真实的数据行,再也不有另外单独的数据页。正由于索引的数据需与数据物理存储的顺序一致,在一张表上最多只能建立一个汇集索引。  非汇集索引:表数据存储顺序与索引顺序无关。对于非汇集索引,叶结点包含索引字段值及指向数据页、数据行的逻辑指针。算法

对非汇集索引和汇集索引的总结与心得: 汇集索引对于那些常常要搜索范围值的列特别有效。使用汇集索引找到包含第一个值的行后,即可以确保包含后续索引值的行在物理相邻。例如,若是应用程序执行 的一个查询常常检索某一日期范围内的记录,则使用汇集索引能够迅速找到包含开始日期的行,而后检索表中全部相邻的行,直到到达结束日期。这样有助于提升此 类查询的性能。一样,若是对从表中检索的数据进行排序时常常要用到某一列,则能够将该表在该列上汇集(物理排序),避免每次查询该列时都进行排序,从而节 省成本。有一点需注意的,是使用汇集索引的查询效率虽然要比非汇集索引的效率要高,可是若是须要频繁去改变汇集索引的值,写入性能并不高,由于须要移动对应数据的物理位置。sql

此处,顺便引入索引的两类方法:B+树索引和哈希索引;先了解下两者的基本概念:B+树是一个平衡的多叉树,从根节点到每一个叶子节点的高度差值不超过1,并且同层级的节点间有指针相互连接。哈希索引就是采用必定的哈希算法,把键值换算成新的哈希值,检索时不须要相似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法便可马上定位到相应的位置,速度很是快。 因而可知,在时间复杂度方面,哈希方法的索引明显是占优,仅为O(1),那从实际sql查询的运用上,在等值查询的时候就可使用哈希方法的索引;可是若是涉及到范围查询和有大量重复键存在的状况,则应选择B+数方法的索引 对哈希索引和B+树索引的总结与心得: 一般,B+树索引结构适用于绝大多数场景(包括范围查询、排序、分组等查询特征),而在存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,就特别适合采用哈希索引。数据库


三、索引有什么用呢?其有什么优缺点? 优势: (1)、加快数据的检索速度 (2)、建立惟一性索引,能保证表中每一行数据的惟一性 (3)、......欢迎补充性能优化

缺点: (1)、建立索引和维护索引须要时间,并且数据量越大时间越长 (2)、建立索引须要占据磁盘的空间,若是有大量的索引,可能比数据文件更快达到最大文件尺寸 (3)、当对表中的数据进行增长,修改,删除的时候,索引也要同时进行维护,下降了数据的维护速度数据结构

对创建索引的设计原则: 1.不是越多越好 2.常更新的表越少越好 3.数据量小的表最好不要创建索引 4.不一样的值比较多的列才须要创建索引 5.某种数据自己具有惟一性的时候,创建惟一性索引,能够保证定义的列的数据完整性,以提升查询熟度 6.频繁进行排序或分组的列(group by或者是order by)能够创建索引,提升搜索速度 7.常常用于查询条件的字段应该创建索引数据库设计


四、索引性能优化 思考:索引居然能提升查询速度,那索引是否是越多越好?,答案固然是否是的,因此咱们须要对索引的性能进行分析,进而选择最合理的索引设计方案。 (1)、sql性能查询:开发中咱们使用explain能够帮助选择更好的索引和写出更优化的查询语句 (2) 、sql执行的效率为(const>eq_ref>ref>range>index>all),具体能够参考连接: http://www.javashuo.com/article/p-djdeatzx-cc.html性能

(3)实际项目中遇到的问题: A、数据量大但没有创建索引 B、有索引但结果集过大致使不走索引 C、使用组合索引的时候,有字段没有命中 D、使用连表查询优化

(4)对上面问题的总结: 对组合索引的字段观察是否都命中; 虽然索引大大提升了查询速度,同时却会下降更新表的速度; MySQL查询只使用一个索引,所以若是where子句中已经使用了索引的话,那么 order by中的列是不会使用索引的;几个单独索引的效率<组合索引; 当结果集超过数据的25%时,不走索引; 单独的sql语句中包含 >,<,in等,走不走索引也是有结果集有关; 字段的大小也会影响索引的的查询速度; 若是组合索引中有一列含有null值,这一列读组合索引无效;


五、针对索引失效的问题,在下面统一概括(欢迎补充) 一、若是条件中有or,即便其中有条件带索引也不会使用 二、当结果集超过数据的25%时,不走索引 三、若是组合索引中有一列含有null值,这一列读组合索引无效 四、单独引用复合索引里非第一位置的索引列 五、对小表查询,mysql认为不用索引更快 六、用like模糊查询以 % 开头 七、单独的sql语句中包含 >,<,in等涉及到范围查询,走不走索引也是有结果集有关;

.............................后续欢迎进行补充


六、索引的概括总结: 在数据库设计时,咱们就应该要充分考虑到索引对后续应用的影响,对索引进行性能分析和针对性的设计。


百度知道:主键和惟一索引的区别; 主键是一种约束,惟一索引是一种索引,二者在本质上是不一样的。 主键建立后必定包含一个惟一性索引,惟一性索引并不必定就是主键。 惟一性索引列容许空值,而主键列不容许为空值。 主键列在建立时,已经默认为空值 + 惟一索引了。 主键能够被其余表引用为外键,而惟一索引不能。 一个表最多只能建立一个主键,但能够建立多个惟一索引。 主键更适合那些不容易更改的惟一标识,如自动递增列、身份证号等。 在 RBO 模式下,主键的执行计划优先级要高于惟一索引。 二者能够提升查询的速度。 explain中type几种类型; type:链接类型  最关键的一列  效率(const>eq_ref>ref>range>index>all) 一、const:查询索引字段,而且表中最多只有一行匹配(好像只有主键查询只匹配一行才会是const,有些状况惟一索引匹配一行会是ref) 二、eq_ref    主键或者惟一索引   三、ref   非惟一索引(主键也是惟一索引) 四、range  索引的范围查询 五、index  (type=index extra = using index 表明索引覆盖,即不须要回表) 六、all 全表扫描(一般没有建索引的列)

相关文章
相关标签/搜索