仓酷云
标题:
MYSQL编程:MySQL不撑持的功效
[打印本页]
作者:
因胸联盟
时间:
2015-1-16 22:23
标题:
MYSQL编程:MySQL不撑持的功能
即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。
3.9MySQL不撑持的功效
本节先容其他数据库中有而MySQL中无的功效。它先容省略了甚么功效,和在必要这些功效时怎样办。一样平常情形下,MySQL之以是疏忽某些功效是由于它们有负面功能影响。有的功效正在开辟者的企图清单上,一旦找到一种办法能够完成响应的功效而又不致于影响
优秀功能的方针,就会对它们举行完成。
■子选择。子选择是嵌套在另外一个SELECT语句内的SELECT语句,以下面的查询所示:
SELECT*FROMscore
WHEREevent_idIN(SELECTevent_idFROMeventWHEREtype="T")
子选择盘算在MySQL3.24中给出,到当时它们就不会疏忽了。但到当时,很多用子选择撰写的查询也能够用毗连来编写。请参阅3.8.1节“将子选择编写为毗连”。
■事件处置和提交/回退。事件处置是由其他客户机作为一个全体不中止实行的一组SQL语句。提交/回退功效同意划定数条语句作为一个全体实行或不实行。即,假如事件处置中的任何一条语句失利,那末直到该语句前实行的一切语句的感化都被取消。
ySQL主动举行单一SQL语句的同步以避免客户机相互搅扰。(比方,两个客户机不克不及对不异的表举行同时写进。)别的,可使用LOCKTABLES和UNLOCKTABLES将数条语句构成一个全体,这使您可以完成单条语句的并发把持所不克不及满意的操纵。MySQL与事件处置有关的成绩是,它不克不及主动对数条语句举行构造,并且假如这些语句中有某一条失利后也不克不及对它们举行回退。
为了弄清事件处置为何有效,可举例申明。假设您在打扮发卖业事情,不管什么时候,只需您的发卖职员举行了一次发卖,都要更新库存数量。上面的例子申明了在多个发卖职员同时更新数据库时大概呈现的成绩(假设初始的衬衫库存数量为47):
t1发卖职员1卖出3件衬衫
t2发卖职员检索以后衬衫计数(47):
SELECTquantityFROMinventoryWHEREitem="shirt"
t3发卖职员2卖出2件衬衫
t4发卖职员2检索以后衬衫计数(47)
SELECTquantityFROMinventoryWHEREitem="shirt"
t5发卖职员1盘算库存的新数量为47-3=44并设置衬衫计数为44:
UPDATEinventorySETquantity=44WHEREitem="shirt"
t6发卖职员2盘算库存的新数量为47-2=45并设置衬衫计数为45:
UPDATEinventorySETquantity=45WHEREitem="shirt"
在这个事务序列停止时,您已卖失落了5件衬衫,但库存数量倒是45而不是42。成绩是假如在一条语句中检察库存而在另外一条语句中更新其值,这是一个多语句的事件处置。第二条语句中所举行的举动取决于第一条语句中检索出的值。可是假如在堆叠的工夫局限内呈现自力的事件处置,则每一个事件处置的语句会胶葛在一同,而且相互搅扰。在事件处置型的数据库中,每一个发卖职员的语句可作为一个事件处置实行,如许,发卖职员2的语句在发卖职员1的语句完成之前不会被实行。在MySQL中,可用两种办法到达这个目标:
■办法1:作为一个全体实行一组语句。可使用LOCKTABLES和UNLOCKTABLES将语句构造在一同,并将它们作为一个原子单位实行:锁居处需利用的表,公布查询,然后开释这些锁。如许制止了其别人在您锁住这些表时利用它们。使用表同步,库存情形以下所示:
t1发卖职员1卖出3件衬衫
t2发卖职员1哀求一个锁并检索以后衬衫计数(47)
LOCKTABLESinventoryWRITE
SELECTquantityFROMinventoryWHEREitem="shirt"
t3发卖职员2卖出2件衬衫
t4发卖职员2试图获得一个锁:这被堵塞,由于发卖职员1已占住了锁:
LOCKTABLESinventoryWRITE
t5发卖职员1盘算库存的新数量为47-3=44并设置衬衫计数为44,然后开释锁:
UPDATEinventorySETquantity=44WHEREitem="shirt"
UNLOCKTABLES
t6如今发卖职员2的锁哀求乐成。发卖职员2检索以后衬衫计数(44)
SELECTquantityFROMinventoryWHEREitem="shirt"
t7发卖职员2盘算库存的新数量为44-2=42,设置衬衫计数为42,然后开释锁:
UPDATEinventorySETquantity=42WHEREitem="shirt"
UNLOCKTABLES
如今来自两个事件处置的语句不搅浑了,而且库存衬衫数也准确举行了设置。我们在这里利用了一个WRITE锁,由于我们必要修正inventory表。假如只是读取表,可以使用READ锁。当您正在利用表时,这个锁同意其他客户机读取表。在方才举的例子中,发卖职员2也许不会注重到实行速率上的差别,由于个中的事件处置都很短,实行速率很快。可是,作为一个具有广泛意义的划定规矩,那就是应当只管制止长工夫地锁住表。
假如您正在利用多个表,那末在您实行成组查询之前,必需锁住他们。假如只是从某个特定的表中读取数据,那末只需给该表加一个读出锁而不是写进锁。假设有一组查询,个中想对inventory表作某些变动,而同时必要从customer表中读取某些数据。在此情况下,inventory表上必要一个写进锁,而customer表上必要一个读出锁:
LOCKTABLESinventoryWRITE,customerREAD
...
UNLOCKTABLES
这里请求您本人对表举行加锁息争锁。撑持事件处置的数据库体系将会主动完成这些事情。可是,在作为一个全体实行的分组语句方面,不管在是不是撑持事件处置的数据库中都是不异的。
■办法2:利用绝对更新而不是相对更新。要办理来自多个事件处置的语句搅浑成绩,应打消语句之间的依附性。固然如许做其实不都老是大概的,它只针对我们的库存例子可行。关于办法1中所用的库存更新办法,个中事件处置必要检察以后库存数量,并根据发卖衬衫的数量盘算新值,然后更新衬衫的数量。有大概经由过程相对以后衬衫数量举行计数更新,在一个步骤中完成事情。以下所示:
t1发卖职员1卖出3件衬衫
t2发卖职员1将衬衫计数减3:
UPDATEinventorySETquantity=quantity-3WHEREitem="shirt"
t3发卖职员2卖出2件衬衫
t4发卖职员2将衬衫计数减2:
UPDATEinventorySETquantity=quantity-2WHEREitem="shirt"
因而,这里基本不必要多条语句的事件处置,从而也不必要锁住表以摹拟事件处置功效。假如所利用的事件处置范例与这里相似,那末就能够不必事件处置也能完成事情。下面的例子申明了在特别情况下如何制止对事件处置功效的需求。但这并非说不存在那种的确必要事件处置功效的场所。典范的例子是财政转账,个中钱从一个账户转到另外一个账户。假设Bill给Bob开了一张$100的支票,Bob兑现了这张支票。Bill的户头上应当减失落$100而Bob的户头上应当增添不异数目的钱:
UPDATEaccountSETbalance=balance-100WHEREname="Bill"
UPDATEaccountSETbalance=balance+100WHEREname="Bob"
假如在这两条语句实行中,体系产生了溃散,此事件处置就不完全了。具有真闲事务处置和提交/回退功效的数据库体系可以处置这类情形(最少从实际上可以处置。您大概仍旧必需判别碰到了哪些事件处置偏重新公布它们,但最少不会忧虑事件只处置了一半)。在MySQL中,体系溃散时可经由过程反省更新日记来判别事件处置的形态,固然这大概必要对日记举行某种手工反省。
■内部键和援用完全性。内部键同意界说一个表中的键与另外一个表中的键相干,而援用完全性同意安排对包括内部键的表能够做甚么的束缚。比方,samp_db样例数据库的score表中包括一个student_id列,我们用它来将学分纪录联系关系到student表中的先生。score.student_id将界说为撑持此观点的数据库中的一个内部键,我们将在其上加上一公约束,使不克不及为student表中不存在的先生输出学分纪录。别的,应当同意级联删除,以便假如某个先生从student表中被删除后,该先生的任何学分纪录将会主动地从
score表中删除。
内部键有助于坚持数据的分歧性,并且还供应了某种便利的手腕。MySQL不撑持内部键的缘故原由次要是因为它对数据库的完成与保护有负感化。(MySQL参考指南具体列出了这些缘故原由。)注重,关于内部键的这类意见与其他数据库文献中的意见有些分歧,有的数据库文献一般将它们形貌成“基础的”。MySQL的开辟者其实不赞成这个概念。假如您同意,那末最好是思索接纳其他供应内部键撑持的数据库。假如数据具有出格庞大的干系,您大概不但愿担当在使用程序中完成这些相干性的事情。(即便如许做的事情量要比增添几个分外的DELETE语句的事情量要稍少一些。)除在必定水平上可以在CREATETABLE语句平分析FOREIGNKEY子句外,MySQL不撑持内部键。(这有助于使从其他数据库移植代码到MySQL更加简单。)MySQL不强迫让内部键作为一种束缚,也不供应级联删除功效。
内部键强迫实行的束缚一样平常不难用程序逻辑来完成。偶然,它只是一个如何举行数据录进处置的成绩。比方,为了将一个新纪录拔出score表,不太大概拔出不存在的先生的学分。明显,输出一组学分的办法应当是依据从student表得出的先生名单,对每一个先生,取其学分并使用该先生的ID号发生一个score表的纪录。关于这个历程,不存在录进一个不存在的先生的纪录的大概。您不会平空造出一个学分纪录来拔出score表。要完成DELETE的级联效果,必需用本人的使用程序逻辑来完成。假设想要删除13号先生。这也隐含暗示必要删除该先生的学分纪录。在撑持级联删除的数据库中,只必要用以下的语句就能够删除student表的纪录和响应的score表的纪录:
DELETEFROMstudentWHEREstudent_id=13
而在MySQL中,必需明白地用DELETE语句本人举行第二个删除语句:
DELETEFROMstudentWHEREstudent_id=13
DELETEFROMscoreWHEREstudent_id=13
■存储历程和触发器。存储历程是编译和寄存在服务器中的SQL代码。它可在今后挪用而无需从客户机发送并剖析。能够对一个历程举行变动以影响利用它的任何客户机使用程序。触发器功效使一个历程在某个事务产生时被激活,如从表中删除某个纪录时,激活响应的历程。比方,某个作为累计成份的纪录被删除时,应当从头举行累计,使累计数反应最新情形。存储历程言语已列进了MySQL筹办完成的企图。
■视图。视图是一个逻辑观点,其功效像表但自己不是表。它供应了一种检察分歧表中的列的路子,在检察时仿佛这些列属于统一个表一样。视图偶然也称为虚表。MySQL也筹办完成视图功效。
■纪录级权限和锁定。MySQL撑持各类权限,从全局权限到数据库、表、列的权限。但它不撑持纪录级的权限。不外,可在使用程序中使用GET_LOCK()和RELEASE_LOCK()函数来完成协同纪录锁。这个历程在附录C“运转算符和函数参考”中响应的项面前目今先容。
■“--”作为正文的入手下手。MySQL不撑持这类正文作风,由于它是一个有歧义的布局,固然自MySQL3.23以来,正文可用两个短划线加一个空格入手下手。更具体的信息,请参阅3.7节“加正文”。
即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。
作者:
深爱那片海
时间:
2015-1-19 10:09
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
作者:
蒙在股里
时间:
2015-1-27 06:25
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
作者:
飘飘悠悠
时间:
2015-2-5 03:51
我们学到了什么?思考问题的时候从表的角度来思考问
作者:
变相怪杰
时间:
2015-2-11 03:55
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者:
愤怒的大鸟
时间:
2015-3-1 21:01
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者:
爱飞
时间:
2015-3-10 23:54
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
作者:
若天明
时间:
2015-3-17 16:13
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
作者:
仓酷云
时间:
2015-3-24 12:43
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2