mysql
Posted kkyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql相关的知识,希望对你有一定的参考价值。
一、基本设计规范
1.数据库对象名称禁止使用mysql关键字
2.对象名称必须使用小写字母并用下划线分割
3.禁止在数据库中存储图片、文件等二进制数据
4.所有表必须使用innodb存储引擎
5.数据库和表的字符集统一使用utf-8
6.所有表和字段都需要添加注释
7.尽量控制单表数据量的大小,建议在500w以内
8.谨慎使用mysql分区表
9.尽量做到冷热数据分离,减小表的宽度
10.禁止在表中建立预留字段
11.禁止在线上做数据库压力测试
12.禁止从开发环境,测试环境直连生产环境数据库
二、索引设计规范
1.限制每张表上的索引数量,建议单张表索引不超过5个
2.每个innodb表必须有一个主键
不使用更新频繁的列作为主键,不使用多列主键
不使用UUID,MD5,HASH,字符串列作为主键
主键建议选择使用自增ID
3.常见索引列建议
select、update、delete语句的where从句中的字段
包含在orderby、groupby、distinct中的字段
多表join的关联列
4.如何选择索引列的顺序
区分度最高的列放在联合索引的最左侧
尽量把字段长度小的列放在联合索引的最左侧
使用最频繁的列放在联合索引的左侧
5.避免建立冗余索引和重复索引
6.对于频繁的查询优先考虑使用覆盖索引
覆盖索引:即覆盖所有查询字段的联合索引
7.尽量避免使用外键
外键可用于保证数据的参照完整性,但建议在业务端实现
外键会影响父表和子表的写操作从而降低性能
三、数据库字段设计规范
1.优先选择符合存储需要的最小的数据类型
将字符串化为数字类型存储
对于非负数据采用无符号整型进行存储
varchar(n)中的n代表的是字符数,而不是字节数
过大的长度会消耗更多的内存
2.避免使用text、blob数据类型
建议把blob或text列分离到单独的扩展表中
text或blob类型只能使用前缀索引
3.避免使用ENUM数据类型
4.尽可能把所有列定义为not null
索引null列需要额外的空间来保存,所以会占用更多的空间
进行比较和计算时要对null值做特别的处理
5.使用timestamp或datetime类型存储时间
6.同财务相关的金额类数据,必须使用decimal类型
decimal类型为精准浮点数,在计算时不会丢失精度
占用空间由定义的宽度决定
四、数据库sql开发规范
1.建议使用预编译语句进行数据库操作
2.避免数据类型的隐式转换
隐式转换会导致索引失效
3.充分利用表上已经存在的索引
避免使用双%号的查询条件。如a like ‘%123%’
一个sql只能利用到符合索引中的一列进行范围查询
使用left join或not exists来代替not in操作,not in可能导致索引失效
4.程序连接不同的数据库使用不同的账号,禁止跨库查询
为数据库迁移和分库分表留出余地
降低业务耦合度
5.禁止使用select *,必须使用select(字段列表)查询
消耗更多的cpu和io以及网络宽带资源
无法使用覆盖索引
可减少表结构变更带来的影响
6.禁止使用不含字段列表的insert语句
如:insert into t values(‘a’,‘b‘)
7.避免使用子查询,可以把子查询优化为join操作
子查询的结果集无法使用索引
子查询会产生临时表操作,如果子查询数据量大则严重影响效率
消耗过多的cpu和io资源
8.避免使用join关联太多的表
9.减少同数据库的交互次数
数据库更适合处理批量的操作
合并多个相同的操作到一起,可以提高处理效率
10.使用in代替or
in的值不要超过500个
in操作可以用到索引
11.禁止使用order by rand()进行随机排序
会把表中所有符合条件的数据装载在到内存中进行排序
会消耗大量的cup和io资源
推荐在程序中获取一个随机值,然后从数据库中获取数据的方式
12.where从句中禁止对列进行函数转换和计算
对列进行函数转换或计算会导致无法使用索引
where date(createtime) = "20160901" 这样不会使用createtime列上的索引
13.在明显不会有重复值时使用union all而不是union
union会把所有数据放到临时表中再进行去重操作
union all不会再对结果集进行去重操作
14.拆分复杂的大sql为多个小sql
mysql一个sql只能使用一个cup进行计算
sql拆分后可以通过并行执行来提高操作效率
以上是关于mysql的主要内容,如果未能解决你的问题,请参考以下文章