MySQL一个字符集转换的骚操作,酿下性能的苦果
这是学习笔记的第2275篇文章
今天处理了一个RDS的问题,突然想起了好几年前处理的一个性能案例,看似不经意的细节竟然让我对整个问题的过程有了更清晰的认识。
整个细节可以参见我写的这篇文章的处理过程:
力荐:一条update语句引发的血案
当时有一个地方没有想明白,那就是里面的字段APNSPUSHID为什么字符集会是latin1,而表的字符集却妥妥的是UTF8,看起来是一个不大可能出现的场景。
下午在协助处理一个问题的时候,才突然明白,我来复现下这个问题。
创建一张表testcharset,设置字符集为latin1mysqlcreatetabletestcharset(idintprimarykey,namevarchar(30),memovarchar(30))charsetlatin1;QueryOK,0rowsaffected(0。12sec)
查看表结构,可以清晰的看到,字段是共享了表的默认字符集,没有显式显示出来。mysqlshowcreatetabletestcharsetG1。rowTable:testcharsetCreateTable:CREATETABLEtestcharset(idint(11)NOT,namevarchar(30)DEFAULT,memovarchar(30)DEFAULT,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETlatin11rowinset(0。01sec)
我们使用如下的语句来变更下表的字符集。mysqlaltertabletestcharsetcharsetutf8;QueryOK,0rowsaffected(0。05sec)Records:0Duplicates:0Warnings:0
这个时候再次查看就会发现,原本继承的latin1字符集现在显式显示出来了,表的字符集是utf8,但是字符类型的字段字符集依然是latin1mysqlshowcreatetabletestcharsetG1。rowTable:testcharsetCreateTable:CREATETABLEtestcharset(idint(11)NOT,namevarchar(30)CHARACTERSETlatin1DEFAULT,memovarchar(30)CHARACTERSETlatin1DEFAULT,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf81rowinset(0。00sec)
如果后续再添加字段,不显式指定字符集。mysqlaltertabletestcharsetaddmemo2varchar(30);QueryOK,0rowsaffected(0。14sec)Records:0Duplicates:0Warnings:0
查看表结构会发现,新字段memo2的字符集就会是utf8mysqlshowcreatetabletestcharsetG1。rowTable:testcharsetCreateTable:CREATETABLEtestcharset(idint(11)NOT,namevarchar(30)CHARACTERSETlatin1DEFAULT,memovarchar(30)CHARACTERSETlatin1DEFAULT,memo2varchar(30)DEFAULT,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf81rowinset(0。00sec)
好了,问题到了这里就相对有了一个思路。
那么产生最开始让人疑惑的问题原因是什么呢?就是哪个骚操作:mysqlaltertabletestcharsetcharsetutf8;
这是一个表级属性的变更,注意MySQL里面字段,表,数据库都可以存在差异化的字符集设置。虽然可以支持,但是显然这样做是不合理的。
而如果要让字段的变更同时生效,应该使用convertto语句,我们为了突出变化,改为utf8mb4字符集。mysqlaltertabletestcharsetconverttocharsetutf8mb4;QueryOK,0rowsaffected(0。13sec)Records:0Duplicates:0Warnings:0
mysqlshowcreatetabletestcharsetG1。rowTable:testcharsetCreateTable:CREATETABLEtestcharset(idint(11)NOT,namevarchar(30)DEFAULT,memovarchar(30)DEFAULT,memo2varchar(30)DEFAULT,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8mb41rowinset(0。00sec)
爱的世界里你只是背景一想到这个题目的时候,我的心里就升起了莫名的伤感。背景啊!多么微不足道。当你走在落日的街道上。当你走在熙熙攘攘的人群,当你在朋友同事面前。你只是一个背景。我们是别人的背景……
在冷漠世界里,阳光的活着如果说,在薄情的世界里深情的活着,是一种情怀的话,在冷漠的世界里阳光的活着就是一种胸怀。社会经验告诉我,这个世界上就有骨子里就是坏人的。也有从里到外都是好人的。有为国为民……
最优雅的孤独者有一个人,他会坐着,一直等到夕阳把他染成红色。然后,又任凭夜幕,把他染成黑色。他从不言。有一个人,他会漫步在每一个冬天,任凭寒风吹打。任凭严寒的威吓。他从不退缩。他从不语……
我的幸福是你忽明忽暗的蜡烛,照着我暗无天日的孤独这是你的秋雨季吗?灰色的压抑从一方天际,漫步到另一方天际用寒凉,潜入到心底闪电撕裂开一道伤口磅礴的眼泪就倾泻而下寒冷的秋雨,你带走了所有东西……
阿妹的天空,阿嬷的世界灰色的世界灰色的天空升起了灰色的月亮灰色的风吹过了灰色的小路上走来了灰蓝色的你每当你来袅袅娜娜走向我那些灰色的小花就格外鲜艳你来到我身边就低……
孤独的圣歌之一不知你想说什么不知雨想说什么于是就去问花朵花儿含着露,它说雨要去远方的山坡不知道风想说什么,于是问小河小河笑着脸说风要去蝴蝶的原野不知道你想说……
拼搏作文范文童年就这么一溜烟的消失的无影无踪,真的好怀念那些美好的时光,更主要是当时的思想是那么的简单,只要开开心心就好,不用想其他的。长大了,烦恼多了,忧愁多了,想的事情也多了,找对象也……
又是一个起点E度网专稿未经允许不得转载假期的结束,是一个学期的终点,又是另一个学期的起点。为上个学期的不足做个弥补与修正,同时去迎接,迎接又一个起点hellip;hellip;……
深秋邂遇凉凉的秋风划过你的脸庞追着我的思绪游走我记得你在田埂菜香的黄昏在泥院剪影的夕阳我记得你在丝丝细雨的午后在暖暖阳光的下午我记……
写黄山的光明顶作文欣赏完了奇松,我们也应看看黄山的两大主峰莲花峰和光明顶瞧瞧了。莲花峰高1864米,是黄山的最高峰。它高耸雄伟,主峰突兀,小峰蔟拥,俨然一朵硕大的亭亭玉莲,仰天怒放。我们也……
棒棒糖我的最爱作文450字我最喜欢吃棒棒糖了。棒棒糖分为两种包装,分别是袋装和盒装,袋装的很普通,不过呢在这普通中还带有几分华丽,那就是它的味道了,盒装的有很多棒棒糖在盒子的肚子里面,从外往里看,……
关于渴望的作文渴望长大在我们童年时,我们是多么的想长大。长大了,就不必读这些无聊的书,整天起早贪黑的去上学。还要做那些让人头痛的试题。可是,我们长大了,又能怎样呢?能摆脱老师的束缚,但能跑过上司的严……