MySQL 基本知识点梳理和查询优化.docx





《MySQL 基本知识点梳理和查询优化.docx》由会员分享,可在线阅读,更多相关《MySQL 基本知识点梳理和查询优化.docx(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MySQL基本知识点梳理和查询优化陈芳志;:说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序,其实不一定是文件排序,内部使用的是快排2、usingtemporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序orderby和分组查询groupby3、usingindex:表示相应的SELECT操作中使用了覆盖索引(CoveringIndex),避免访问了表的数据行,效率不错。4、impossiblewhere:WHERE子句的值总是false,不能用来获取任何元组5、selec
2、ttablesoptimizedaway:在没有GROUPBY子句的情况下基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化6、distinct:优化distinct操作,在找到第一匹配的元祖后即停止找同样值的操作usingfilesort,usingtemporary这两项出现时需要注意下,这两项是十分耗费性能的,在使用groupby的时候,虽然没有使用orderby,如果没有索引,是可能同时出现usingfilesort,usingtemporary的,因为groupby就是先排序在分组,如果没有
3、排序的需要,可以加上一个orderbyNULL来避免排序,这样usingfilesort就会去除,能提升一点性能。type字段system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现const:如果通过索引依次就找到了,const用于比较主键索引或者unique索引。因为只能匹配一行数据,所以很快。如果将主键置于where列表中,MySQL就能将该查询转换为一个常量eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然
4、而它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是在你的where语句中出现between、<、>、in等的查询,这种范围扫描索引比全表扫描要好,因为只需要开始于缩印的某一点,而结束于另一点,不用扫描全部索引index:FullIndexScan,index与ALL的区别为index类型只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然ALL和index都是读全表,但index是从索引中读取的,而ALL是从硬盘读取的)all:FullTableScan,
5、遍历全表获得匹配的行三、字段类型和编码1、mysql返回字符串长度:CHARACTER_LENGTH方法(CHAR_LENGTH一样的)返回的是字符数,LENGTH函数返回的是字节数,一个汉字三个字节2、varvhar等字段建立索引长度计算语句:selectcount(distinctleft(test,5)/count(*)fromtable;越趋近1越好3、mysql的utf8最大是3个字节不支持emoji表情符号,必须只用utf8mb4。需要在mysql配置文件中配置客户端字符集为utf8mb4。jdbc的连接串不支持配置characterEncoding=utf8mb4,最好的办法是在
6、连接池中指定初始化sql,例如:hikari连接池,其他连接池类似spring.datasource.hikari.connection-init-sql=setnamesutf8mb4。否则需要每次执行sql前都先执行setnamesutf8mb4。4、msyql排序规则(一般使用_bin和_genera_ci):utf8_genera_ci不区分大小写,ci为caseinsensitive的缩写,即大小写不敏感,utf8_general_cs区分大小写,cs为casesensitive的缩写,即大小写敏感,但是目前MySQL版本中已经不支持类似于*_genera_cs的排序规则,直接使用u
7、tf8_bin替代。utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。那么,同样是区分大小写,utf8_general_cs和utf8_bin有什么区别?cs为casesensitive的缩写,即大小写敏感;bin的意思是二进制,也就是二进制编码比较。utf8_general_cs排序规则下,即便是区分了大小写,但是某些西欧的字符和拉丁字符是不区分的,比如=a,但是有时并不需要=a,所以才有utf8_binutf8_bin的特点在于使用字符的二进制的编码进行运算,任何不同的二进制编码都是不同的,因此在utf8_bin排序规则下:<>a5、sqlyog中初始连接指定
8、编码类型使用连接配置的初始化命令四、SQL语句总结常用的但容易忘的:1、如果有主键或者唯一键冲突则不插入:insertignoreinto2、如果有主键或者唯一键冲突则更新,注意这个会影响自增的增量:INSERTINTOroom_remarks(room_id,room_remarks)VALUE(1,sdf)ONDUPLICATEKEYUPDATEroom_remarks=2343、如果有就用新的替代,values如果不包含自增列,自增列的值会变化:REPLACEINTOroom_remarks(room_id,room_remarks)VALUE(1,sdf)4、备份表:CREATETAB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MySQL 基本知识点梳理和查询优化 基本 知识点 梳理 查询 优化

限制150内