精灵巫婆 发表于 2015-1-16 20:13:50

MYSQL教程之解说MySQL索引的观点及数据库索引的使用

对于IT经理来说,令他们喜欢的MySQL的简单性还有另一方面。MySQL可以运行的更快速。某些人或许会说MySQL缺少了一些人们想要的功能。1.数据库引进了索引<Pstyle="TEXT-INDENT:2em">用户对数据库最频仍的操纵是举行数据查询。一样平常情形下,数据库在举行查询操纵时必要对全部表举行数据搜刮。当表中的数据良多时,搜刮数据就必要很长的工夫,这就形成了服务器的资本华侈。为了进步检索数据的才能,数据库引进了索引机制。<Pstyle="TEXT-INDENT:2em">2.有关“索引”的比方<Pstyle="TEXT-INDENT:2em">从某种水平上,能够把数据库看做一本书,把索引看做书的目次,经由过程目次查找书中的信息,明显较没有目次的书便利、快速。<Pstyle="TEXT-INDENT:2em">3.数据库索引实践是甚么?(两部分构成)<Pstyle="TEXT-INDENT:2em">索引是一个独自的、物理的数据库布局,它是某个表中一列或多少列值的汇合和响应的指向表中物理标识这些值的数据页的逻辑指针清单。<Pstyle="TEXT-INDENT:2em">4.索引在表中的脚色<Pstyle="TEXT-INDENT:2em">一个表的存储是由两部分构成的,一部分用来寄存表的数据页面,另外一部分寄存索引页面。索引就寄存在索引页面上,<Pstyle="TEXT-INDENT:2em">5.索引高效道理<Pstyle="TEXT-INDENT:2em">一般,索引页面相对数据页面来讲小很多。当举行数据检索时,体系先搜刮索引页面,从中找到所需数据的指针,再间接经由过程指针从数据页面中读取数据。<Pstyle="TEXT-INDENT:2em">6.索引的分类<Pstyle="TEXT-INDENT:2em">在SQLServer的数据库中按存储布局的分歧将索引分为两类:簇索引(ClusteredIndex)和非簇索引(NonclusteredIndex)。<Pstyle="TEXT-INDENT:2em">(1)簇索引对表的物理数据页中的数据按列举行排序,然后再从头存储到磁盘上,即簇索引与数据是混为一体,的它的叶节点中存储的是实践的数据。因为簇索引对表中的数据逐一举行了排序,因而用簇索引查找数据很快。但因为簇索引将表的一切数据完整从头分列了,它所必要的空间也就出格年夜,也许相称于表中数据所占空间的120%。表的数据行只能以一种排序体例存储在磁盘上,以是一个表只能有一个簇索引。<Pstyle="TEXT-INDENT:2em">(2)非簇索引具有与表的数据完整分别的布局,利用非簇索引不必将物理数据页中的数据按列排序。非簇索引的叶节点中存储了构成非簇索引的关头字的值和行定位器。行定位器的布局和存储内容取决于数据的存储体例。假如数据是以簇索引体例存储的,则行定位器中存储的是簇索引的索引键;假如数据不是以簇索引体例存储的,这类体例又称为堆存储体例(HeapStructure),则行定位器存储的是指向数据行的指针。非簇索引将行定位器按关头字的值用必定的体例排序,这个按次与表的行在数据页中的排序是不婚配的。因为非簇索引利用索引页存储因而它比簇索引必要更多的存储空间且检索效力较低但一个表只能建一个簇索引,当用户必要创建多个索引时就必要利用非簇索引了。<Pstyle="TEXT-INDENT:2em">小结:ClusteredIndex是与物理数据混在一同并对物理数据进重排,就像利用拼音查字典;UnclusteredIndex是与物理数据完整分别的,使用分外空间对关头字举行重排,就像利用部首查字典。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">数据库索引使用<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">1、索引的观点<Pstyle="TEXT-INDENT:2em">索引就是加速检索表中数据的办法。数据库的索引相似于书本的索引。在书本中,索引同意用户不用翻阅完全个书就可以敏捷地找到所必要的信息。在数据库中,索引也同意数据库程序敏捷地找到表中的数据,而不用扫描全部数据库。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">2、索引的特性<Pstyle="TEXT-INDENT:2em">1.索引能够加速数据库的检索速率<Pstyle="TEXT-INDENT:2em">2.索引下降了数据库拔出、修正、删除等保护义务的速率<Pstyle="TEXT-INDENT:2em">3.索引创立在表上,不克不及创立在视图上<Pstyle="TEXT-INDENT:2em">4.索引既能够间接创立,也能够直接创立<Pstyle="TEXT-INDENT:2em">5.能够在优化埋没中,利用索引<Pstyle="TEXT-INDENT:2em">6.利用查询处置器实行SQL语句,在一个表上,一次只能利用一个索引<Pstyle="TEXT-INDENT:2em">7.其他<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">3、索引的长处<Pstyle="TEXT-INDENT:2em">1.创立独一性索引,包管数据库表中每行数据的独一性<Pstyle="TEXT-INDENT:2em">2.年夜年夜加速数据的检索速率,这也是创立索引的最次要的缘故原由<Pstyle="TEXT-INDENT:2em">3.减速表和表之间的毗连,出格是在完成数据的参考完全性方面出格成心义。<Pstyle="TEXT-INDENT:2em">4.在利用分组和排序子句举行数据检索时,一样能够明显削减查询平分组和排序的工夫。<Pstyle="TEXT-INDENT:2em">5.经由过程利用索引,能够在查询的过程当中利用优化埋没器,进步体系的功能。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">4、索引的弱点<Pstyle="TEXT-INDENT:2em">1.创立索引和保护索引要泯灭工夫,这类工夫跟着数据量的增添而增添<Pstyle="TEXT-INDENT:2em">2.索引必要占物理空间,除数据表占数据空间以外,每个索引还要占必定的物理空间,假如要创建聚簇索引,那末必要的空间就会更年夜<Pstyle="TEXT-INDENT:2em">3.当对表中的数据举行增添、删除和修正的时分,索引也要静态的保护,下降了数据的保护速率<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">5、索引分类<Pstyle="TEXT-INDENT:2em">1.间接创立索引和直接创立索引<Pstyle="TEXT-INDENT:2em">间接创立索引:CREATEINDEXmycolumn_indexONmytable(myclumn)<Pstyle="TEXT-INDENT:2em">直接创立索引:界说主键束缚大概独一性键束缚,能够直接创立索引<Pstyle="TEXT-INDENT:2em">2.一般索引和独一性索引<Pstyle="TEXT-INDENT:2em">一般索引:CREATEINDEXmycolumn_indexONmytable(myclumn)<Pstyle="TEXT-INDENT:2em">独一性索引:包管在索引列中的全体数据是独一的,对聚簇索引和非聚簇索引都可使用<Pstyle="TEXT-INDENT:2em">CREATEUNIQUECOUSTEREDINDEXmyclumn_cindexONmytable(mycolumn)<Pstyle="TEXT-INDENT:2em">3.单个索引和复合索引<Pstyle="TEXT-INDENT:2em">单个索引:即非复合索引<Pstyle="TEXT-INDENT:2em">复合索引:又叫组合索引,在索引创建语句中同时包括多个字段名,最多16个字段<Pstyle="TEXT-INDENT:2em">CREATEINDEXname_indexONusername(firstname,lastname)<Pstyle="TEXT-INDENT:2em">4.聚簇索引和非聚簇索引(会萃索引,聚集索引)<Pstyle="TEXT-INDENT:2em">聚簇索引:物理索引,与基表的物理按次不异,数据值的按次老是依照按次分列<Pstyle="TEXT-INDENT:2em">CREATECLUSTEREDINDEXmycolumn_cindexONmytable(mycolumn)WITH<Pstyle="TEXT-INDENT:2em">ALLOW_DUP_ROW(同意有反复纪录的聚簇索引)<Pstyle="TEXT-INDENT:2em">非聚簇索引:CREATEUNCLUSTEREDINDEXmycolumn_cindexONmytable(mycolumn)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">6、索引的利用<Pstyle="TEXT-INDENT:2em">1.当字段数据更新频次较低,查询利用频次较高而且存在大批反复值是倡议利用聚簇索引<Pstyle="TEXT-INDENT:2em">2.常常同时存取多列,且每列都含有反复值可思索创建组合索引<Pstyle="TEXT-INDENT:2em">3.复合索引的前导列必定好把持好,不然没法起到索引的效果。假如查询时前导列不在查询前提中则该复合索引不会被利用。前导列必定是利用最频仍的列<Pstyle="TEXT-INDENT:2em">4.多表操纵在被实践实行前,查询优化器会依据毗连前提,列出几组大概的毗连计划并从中找出体系开支最小的最好计划。毗连前提要充份思索带有索引的表、行数多的表;表里表的选择可由公式:外层表中的婚配行数*内层表中每次查找的次数断定,乘积最小为最好计划<Pstyle="TEXT-INDENT:2em">5.where子句中对列的任何操纵了局都是在sql运转时逐列盘算失掉的,因而它不能不举行表搜刮,而没有利用该列下面的索引;假如这些了局在查询编译时就可以失掉,那末就能够被sql优化器优化,利用索引,制止表搜刮(例:select*fromrecordwheresubstring(card_no,1,4)=’5378’<Pstyle="TEXT-INDENT:2em">&&select*fromrecordwherecard_nolike’5378%’)任何对列的操纵都将招致表扫描,它包含数据库函数、盘算表达式等等,查询时要尽量将操纵移至等号右侧<Pstyle="TEXT-INDENT:2em">6.where前提中的’in’在逻辑上相称于’or’,以是语法剖析器会将in(’0′,’1′)转化为column=’0′orcolumn=’1′来实行。我们希冀它会依据每一个or子句分离查找,再将了局相加,如许能够使用column上的索引;但实践上它却接纳了"or战略",即先掏出满意每一个or子句的行,存进一时数据库的事情表中,再创建独一索引以往失落反复行,最初从这个一时表上钩算了局。因而,实践历程没有益用column上索引,而且完成工夫还要受tempdb数据库功能的影响。in、or子句常会利用事情表,使索引生效;假如不发生大批反复值,能够思索把子句拆开;拆开的子句中应当包括索引7.要擅长利用存储历程,它使sql变得加倍天真和高效。
也许最好的策略是以不变应万变:给客户他们所需要的,不多也不少。如果MySQL学习教程适合他们,他们就不应该买别的工具。事实上,云计算产业一直推崇自助服务,但提供这些服务的公司已经开始认识到解决方案提供商推销他们商品的价值。

爱飞 发表于 2015-1-18 18:53:17

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

admin 发表于 2015-1-27 18:12:16

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书

若天明 发表于 2015-2-5 14:37:21

这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。

谁可相欹 发表于 2015-2-12 07:27:23

我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!

第二个灵魂 发表于 2015-3-3 01:20:24

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!

乐观 发表于 2015-3-11 08:47:36

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。

蒙在股里 发表于 2015-3-18 03:24:11

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。

飘飘悠悠 发表于 2015-3-25 11:43:40

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
页: [1]
查看完整版本: MYSQL教程之解说MySQL索引的观点及数据库索引的使用