MySQL使用记录
Posted 捞鱼之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL使用记录相关的知识,希望对你有一定的参考价值。
数据库设计规范
基础规范
-
表必须有主键,建议使用整型作为主键 -
禁止使用外键,表之间的关联性和完整性通过应用层控制 -
表设计之初,应考虑大致的数量级,若表的记录数低于1000w,尽量使用单表,不建议分表 -
建议将大字段,访问频率低及不需要筛选的字段拆分到拓展表中(做好垂直拆分) -
控制单实例中表的总数,单个表分表个数控制在1024以内
表设计规范
emememem~
列设计规范
-
合理使用字段类型 -
所有字段应定义为NOT NULL并设置默认值
索引规范
-
不建议在频率更新的字段建立索引 -
单表索引数建议5个以内,过多,insert性能下降,导致mysql使用错误的索引。可以在语句中加force index 来强制使用某一个索引 -
组合索引不建议超过5个,理解组合索引最左原则,避免重复建索引。譬如 若建立了(a,b,c),相当于建立了(a),(a,b),(a,b,c) -
非必要不要进行join查询,如果进行join查询,被join的字段必须类型相同,最好建立好索引
SQL规范
-
禁止 select * -
insert 必须指定字段 -
隐式转换会使索引失效,导致全表扫描 -
禁止where条件使用函数或者表达式,导致不能命中索引,全表扫描。如有必要可建立函数索引 -
禁止负向查询(!=,<>,not in)以及%开头的模糊查询 -
避免直接返回大结果集造成内存溢出,可采用分段或游标方式 -
同一字段上多个or可改写为in,in的值必须小于1024个字符,因为or不走索引,in走索引
常见问题集
问题一
mysql5.7版本以上默认开启only_full_group_by 执行group by语句会出现 this is incompatible with sql_mode=only_full_group_by的错误信息
查看官网
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
解决方案
全局修改:
SET GLOBAL sql_mode = sys.list_drop(@@global.sql_mode, 'ONLY_FULL_GROUP_BY');
临时修改:
SET SESSION sql_mode = sys.list_drop(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');
查看sql_mode的值:
SELECT @@session.sql_mode;
SELECT @@sql_mode;
SELECT @@global.sql_mode;
以上解决方案仅只能在mysql服务不断电的情况生效,如需解决请自行到mysql的安装目录下的配置文件修改sql_mode
以上是关于MySQL使用记录的主要内容,如果未能解决你的问题,请参考以下文章
具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包