仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 671|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL教程之Mysql技能之索引剖析和优化

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
尽管MySQL也有一个认证培训项目,但是它的培训却要比Oracle或MS-SQL相差很远。尽管有的使用MySQL的用户表示,MySQL很容易上手,但是对于具有企业级数据库需求的用户来说,mysql|技能|索引|优化索援用来疾速地寻觅那有特定值的纪录,一切MySQL索引都以B-树的情势保留。假如没有索引,实行查询时MySQL必需从第一个纪录入手下手扫描全部表的一切纪录,直至找到切合请求的纪录。内外面的纪录数目越多,这个操纵的价值就越高。假如作为搜刮前提的列上已创立了索引,MySQL无需扫描任何纪录便可敏捷失掉方针纪录地点的地位。假如表有1000个纪录,经由过程索引查找纪录最少要比按次扫描纪录快100倍。  假定我们创立了一个名为people的表:
  CREATETABLEpeople(peopleidSMALLINTNOTNULL,nameCHAR(50)NOTNULL);
  然后,我们完整随机把1000个分歧name值拔出到people表。下图显现了people表地点数据文件的一小部分:

  能够看到,在数据文件中name列没有任何明白的序次。假如我们创立了name列的索引,MySQL将在索引中排序name列:

  关于索引中的每项,MySQL在外部为它保留一个数据文件中实践纪录地点地位的“指针”。因而,假如我们要查找name即是“Mike”纪录的peopleid(SQL命令为“SELECTpeopleidFROMpeopleWHEREname=Mike;”),MySQL可以在name的索引中查找“Mike”值,然后间接转到数据文件中响应的行,正确地前往该行的peopleid(999)。在这个过程当中,MySQL只需处置一个行就能够前往了局。假如没有“name”列的索引,MySQL要扫描数据文件中的一切纪录,即1000个纪录!明显,必要MySQL处置的纪录数目越少,则它完成义务的速率就越快。
  索引的范例
  MySQL供应多种索引范例供选择:
  一般索引
  这是最基础的索引范例,并且它没有独一性之类的限定。一般索引能够经由过程以下几种体例创立:
  创立索引,比方CREATEINDEX<索引的名字>ONtablename(列的列表);修正表,比方ALTERTABLEtablenameADDINDEX[索引的名字](列的列表);创立表的时分指定索引,比方CREATETABLEtablename([...],INDEX[索引的名字](列的列表));
  独一性索引
  这类索引和后面的“一般索引”基础不异,但有一个区分:索引列的一切值都只能呈现一次,即必需独一。独一性索引能够用以下几种体例创立:
  创立索引,比方CREATEUNIQUEINDEX<索引的名字>ONtablename(列的列表);修正表,比方ALTERTABLEtablenameADDUNIQUE[索引的名字](列的列表);创立表的时分指定索引,比方CREATETABLEtablename([...],UNIQUE[索引的名字](列的列表));
  主键
  主键是一种独一性索引,但它必需指定为“PRIMARYKEY”。假如你已经用过AUTO_INCREMENT范例的列,你大概已熟习主键之类的观点了。主键一样平常在创立表的时分指定,比方“CREATETABLEtablename([...],PRIMARYKEY(列的列表));”。可是,我们也能够经由过程修正表的体例到场主键,比方“ALTERTABLEtablenameADDPRIMARYKEY(列的列表);”。每一个表只能有一个主键。
  全文索引
  MySQL从3.23.23版入手下手撑持全文索引和全文检索。在MySQL中,全文索引的索引范例为FULLTEXT。全文索引能够在VARCHAR大概TEXT范例的列上创立。它能够经由过程CREATETABLE命令创立,也能够经由过程ALTERTABLE或CREATEINDEX命令创立。关于年夜范围的数据集,经由过程ALTERTABLE(大概CREATEINDEX)命令创立全文索引要比把纪录拔出带有全文索引的空表更快。本文上面的会商不再触及全文索引,要懂得更多信息,请拜见MySQLdocumentation。
  单列索引与多列索引
  索引能够是单列索引,也能够是多列索引。上面我们经由过程详细的例子来讲明这两种索引的区分。假定有如许一个people表:
  CREATETABLEpeople(peopleidSMALLINTNOTNULLAUTO_INCREMENT,firstnameCHAR(50)NOTNULL,lastnameCHAR(50)NOTNULL,ageSMALLINTNOTNULL,townidSMALLINTNOTNULL,PRIMARYKEY(peopleid));


[1][2][3]下一页

为维持生产环境和非生产环境需要不断地投入管理支持费用MySQL学习教程,最终导致客户为数据库资源投入巨额成本。
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-19 22:50:42 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
因胸联盟 该用户已被删除
板凳
发表于 2015-1-25 22:13:33 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
小女巫 该用户已被删除
地板
发表于 2015-2-4 07:07:08 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-9 18:31:09 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
谁可相欹 该用户已被删除
6#
发表于 2015-2-27 15:52:21 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
小魔女 该用户已被删除
7#
发表于 2015-3-9 09:45:43 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
深爱那片海 该用户已被删除
8#
发表于 2015-3-16 21:25:40 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-23 02:47:10 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 02:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表