mysql 需要知道的常识

查阅其他文章做的总结,记录一下

character set和collation简单理解

  • character set 字符集
    即字符集,常用的UTF-8、GB2312、GB18030是对Unicode的一套编码
    软件国际化是大势所趋,所以Unicode是国际化最佳的选择。当然为了提高性能,有些情况下还是使用latin1比较好。

  • MySQL有两个支持Unicode的character set:
    ucs2:使用16bits来表示一个Unicode字符。
    utf8:使用1~3bytes来表示一个Unicode字符。
    选择哪个character set视情况而定,例如utf8表示latin字符只需要一个字节,所以当用户数据大部分为英文等拉丁字符时,使用utf8比较节省数据库的存储空间

  • utf8和utf8mb4的区别
    MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了

那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢?
原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等(utf8的缺点)

collation

指定数据集如何排序,以及字符串的比对规则
每个character set会对应一定数量的collation。查看方法是在MySQL的Console下输入
show collation;
eg:
utf8_danish_ci
ci是case insensitive的缩写,cs是case sensitive的缩写。即,指定大小写是否敏感。
utf8_bin是将字符串中的每一个字符用二进制数据存储,区分大小写。

utf8_general_ci,utf8_unicode_ci,utf8_danish_ci有什么区别
同一个character set的不同collation的区别在于排序、字符串对比的准确度(相同两个字符在不同国家的语言中的排序规则可能是不同的)以及性能。
例如:
utf8_general_ci在排序的准确度上要逊于utf8_unicode_ci,当然,对于英语用户应该没有什么区别。但性能上(排序以及比对速度)要略优于utf8_unicode_ci.例如前者没有对德语中ß=ss的支持。而utf8_danish_ci相比utf8_unicode_ci增加了对丹麦语的特殊排序支持

索引

  • 1、索引类型
    MYSQL索引有四种
    PRIMARY(唯一且不能为空;一张表只能有一个主键索引)、
    它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。被标志为自动增长的字段一定是主键,但主键不一定是自动增长。一般把主键定义在无意义的字段上(如:编号),主键的数据类型最好是数值

  • INDEX(普通索引)

  • UNIQUE(唯一性索引)、

  • FULLTEXT(全文索引:用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以)
    旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。
    不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引

  • 索引方法
    mysql的两种索引方法(Innodb和MyISAM默认的索引是Btree索引):
    1).HASH(用于对等比较,如"="和" <=>") //<=> 安全的比对 ,用与对null值比较,语义类似is null()
    2).BTREE(用于非对等比较,比如范围查询)>,>=,<,<=、BETWEEN、Like

  • 索引使用注意事项:
    1.索引会忽略null值,所以我们在设计数据库的时候设置为为NOT NULL;
    2.短索引(给索引设置长度)不仅能够提高查询速度,而且能节省I/O操作。
    3.Mysql在查询的时候只会使用一个索引,但不是一个字段
    4.不鼓励使用like对索引操作:like"%aaa%"不会使用索引;但like“aaa%”会使用索引。即可以对固定起始值模糊查询
    5.不适用于否地操作(not in , <>, !=,or) //用到or地方,尽量用union,或者程序两次查找
    6.如果创建了索引,但是查询语句并没有使用,则会使原来的效率更差

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容