|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
事实上,在任何DBaaS中,解决方案提供商对如何管理物理资源都没有控制权,因此MySQL学习教程可能会发现由于DBaaS的局限性使得他们提供给客户的远远小于客户所期望的。 MySQL左毗连查询是毗连查询中的一种体例,上面就为您先容MySQL左毗连查询中的一些成绩议论,假如您感乐趣的话,无妨一看。
我这里所说的主表是指在毗连查询里MySQL以哪一个表为主举行查询。好比说在MySQL左毗连查询里,一样平常来讲左表就是主表,但这只是履历之谈,良多时分履历主义是靠不住的,为了申明成绩,先来个例子,建两个演示用的表categories和posts:- CREATETABLEIFNOTEXISTS`categories`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(15)NOTNULL,`created`datetimeNOTNULL,PRIMARYKEY(`id`),KEY`name`(`name`));CREATETABLEIFNOTEXISTS`posts`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`category_id`int(10)unsignedNOTNULL,`title`varchar(100)NOTNULL,`content`varchar(200)NOTNULL,`created`datetimeNOTNULL,PRIMARYKEY(`id`),KEY`category_id`(`category_id`),KEY`created`(`created`),KEY`category_id_created`(`category_id`,`created`));
复制代码 先注重一下每一个表的索引情形,今后会用到,记得任意拔出一点测试数据,不必太多,但怎样也得两行以上,然后实行以下- SQL:EXPLAINSELECT*FROMpostsLEFTJOINcategoriesONposts.category_id=categories.idWHEREcategories.nameLIKEfoobar%ORDERBYposts.createdDESC
复制代码 了局以下所示:- tablekeyExtracategoriesnameUsingwhere;Usingtemporary;Usingfilesortpostscategory_id
复制代码 在join查询的explain的了局中,第一行暗示的表就是主表。以是说在此查询里categories是主表,而在我们的履历里,LEFTJOIN查询里,左表(posts表)才应当是主表,这发生一个基本的冲突,MySQL之以是如许处置,是由于在我们的WHERE部分,查询前提是依照categories表的字段来举行选择的,且categories表恰好存在符合的索引,以是在查询时把categories表作为主表更有益于减少了局集。
那explain了局中的Usingtemporary;Usingfilesort又是为何呢,为何created或category_id_created索引有效呢?这是由于主表是categories表,从表是posts表,而我们利用从表的字段往ORDERBY,这一般不是一个好选择,最好改成主表字段。不外良多时分改不了,那就没招了。
再看一个对照奇异的例子:- EXPLAINSELECT*FROMpostsLEFTJOINcategoriesONposts.category_id=categories.idWHEREcategories.id=‘一个已存在的ID’ORDERBYposts.createdDESC
复制代码 这个例子里posts表仍旧是从表,可是依照从表排序的了局却没有呈现文件排序和一时表,这是由于已断定了categories.id,以是主表相称于一个只要一行数据的常量表了,从表依据category_id_created索引在毗连的同时天然就失掉排序后的了局。但换个角度看,既然categories.id都是断定的了,那相似如许的需求,我们一样平常就不会再利用LEFTJOIN查询了,而会分红两个自力的查询往检索categories和posts才对。
客观上一旦弄错了主表,大概怎样调剂索引都得不到高效的SQL,以是在写SQL时,好比说在写MySQL左毗连查询时,假如但愿左表是主表,那末就要包管在WHERE语句里的查询前提尽量多的利用左表字段,进而,一旦断定了主表,也最好只经由过程主表字段往ORDERBY。
注重:年夜多半情形下,利用从表字段往排序都是低效的,我最后的例子误导了人人,已改正。
<Pstyle="TEXT-INDENT:2em">
DBaaS会导致单一客户利润率的下降,因为云服务一般是依靠MySQL学习教程数来抵消较低的利润率。 |
|