MySql最佳实践-札记

2020-07-16  本文已影响0人  zhglance

一、表:

二、主键和索引:

三、字段:

varchar的长度问题

MySql 5.0 之前的版本: n指的是n个字节,如果存放utf-8格式只能保存 (n / 3)个汉字,即如果varchar(20) 那么只能保存6个汉字;
MySql 5.0 之后的版本: n指的是n个字符,如果存放utf-8格式,那么无论是数字,字母还是汉字,都可存放n个,即如果varchar(20) 那么可以保存20个汉字(自己亲测可以);
gbk类型:varchar(n)中每个字符最多占2个字节,最大长度不能超过(65535 / 2);
utf-8类型:varchar(n)中每个字符最多占3个字节,最大长度不能超过(65535 / 3);

关于n的大小,看到有人建议设置为8的倍数或者(2^k)-1大小,// 这些理论依据待补充。

备注:timestamp 类型的default CURRENT_TIMESTAMP

datetime 和 timestamp 的区别:

类型 占据字节 表示形式 表示范围 说明
datetime 8 字节 yyyy-mm-dd hh:mm:ss '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999' 1.datetime以 8 个字节储存,不会进行时区的检索;
2.对于datetime来说,存什么拿到的就是什么;
3.如果存进去的是NULL, datetime会储存为NULL。
timestamp 4 字节 yyyy-mm-dd hh:mm:ss '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999' 1.timestamp 只占 4 个字节,而且是以utc的格式储存, 它会自动检索当前时区并进行转换。
2.时间范围只到2039年,需要特别注意业务场景;
3.对于timestamp来说,如果储存时的时区和检索时的时区不一样,那么拿出来的数据也不一样。
4.如果存进去的是NULL,timestamp会自动储存当前时间

四、SQL书写:

count(*) : 所有的列,相当于数据行数,在统计结果的时候,字段值为null的也计入统计;
count(1): 所有的列,相当于数据行数,在统计结果的时候,字段值为null的也计入统计;
count(列名):只包括列名那一列,字段值为null时,不统计.
从上面原理可以理解:count(1)和count(*)基本无差别。
count性能由高到低:count(主键字段) > count(1) > count(非主键字段) > count(*)

五、Explain执行计划

<未完待续>

上一篇 下一篇

猜你喜欢

热点阅读