在工作中作为DBA的我们,可能也会需要面对开发人员各种 Freestyle 的要求,但是他们是否知道在操作数据库的时候,需要注意哪些事项呢?
今儿带着大家简单聊聊 MySQL 数据库的开发行为规范,十大铁的纪律。对DBA老铁们是一种帮助,对开发人员也是一种学习。
1. 创建的表要使用 innodb 存储引擎表
现在基本上大部分业务都是 innodb 存储引擎,MySQL 8.0 开始,彻底不再使用 myisam。每张表都要包含一个自增的主键 id。
2. 数据类型的选择上,要秉着越简单越好,越小越好的原则。
建议使用 int 来存储 ipv4 的类型,可以通过函数转换。金钱类的字段也可以存储为 int 类型,用分做单位就可以了。
时间类型可以采用 datetime,它比 tiemstamp 可用范围大,存储空间也从原来的 8 字节,降到了 5 字节,性能上也不错。
mysql> select inet_aton('192.168.56.132');
+-----------------------------+
| inet_aton('192.168.56.132') |
+-----------------------------+
| 3232249988 |
+-----------------------------+
mysql> select inet_ntoa(3232249988);
+-----------------------+
| inet_ntoa(3232249988) |
+-----------------------+
| 192.168.56.132 |
+-----------------------+
1 row in set (0.00 sec)
3. 库名、表名、字段名必须使用小写字母,采用“_“分割
MySQL 数据库中,通过参数 lower_case_table_names 来区分表名的大小写 默认为 0,代表大小写敏感。如果是 1,大小写不敏感,以小写存储。
4. 不建议使用 ENUM 类型,使用 TINYINT 来代替。
也不建议使用大数据类型的字段如text或者blob出现在业务表中。
5. 表字符集使用 utf8,必要时可申请使用 utf8mb4 字符集。
它的通用性比 gbk,latin1 都要好。utf8 字符集存储汉字占用 3 个字节,如果遇到表情存储的要求,就可以使用 utf8mb4
6. select 查询表的时候只需要获取必要的字段,避免使用 select *。
这样可以减少网络带宽消耗,还有可能利用到覆盖索引
7. 所有字段定义中,默认都加上 not null 约束,避免出现 null。
在对该字段进行 select count() 统计计数时,可以让统计结果更准确,因为值为 null 的数据,不会被计算进去的。
8. 创建索引的时候不要在低基数列上建立索引,像 sex、status 这种字段上面。
要通过索引的选择性来判断 select count(distinct col1)/count(*) from table_name; 越接近 1,证明选择性越高,越适合创建索引。一般情况下,单表索引数量不要超过 4-5 个范围。
9. SQL语句中,尽量避免出现 or 子句
这种判断的子句可以让程序自行完成,不要交给数据库判断。也要避免使用 union,尽量采用 union all,减少了去重和排序的工作。
10. 时时做好监控工作,经常对线上 sql 语句,进行在线捕获进行分析。
可以利用 percona-toolkit 工具。
目前先写这么多,欢迎大家及时补充,其实好多工作都需要 DBA 和开发人员密切配合。新的业务要上线,DBA 就要参与到业务中,配合开发一起建表建模。我们只有一个目的,就是更舒服得工作,挣更多的钱,那为啥不能改变一下我们不好的工作习惯呢。工作中不是你想怎么着,就怎么着!继续努力吧!
2017-10-11 16:07:24 回复