mysql设计表时注意事项
说明:本文是对项目过程中的一些要求的简单汇总整理,主要是供个人本身参考。。。
一、表设计
1、
在创建表结构时,表名、字段需要见名知意,不采用拼音
create table `tb_abc` (
`id` int(10) unsigned not null auto_increment comment "此处写你的注释",
`name` varchar(50) not null comment '此处写你的注释',
)engine=innodb default charset=utf8mb4 comment '此处写你的注释';
一定要有主键!一定要有主键!
整形自增(一般用无业务意义的id)(用mycat如有自增功能,就不需要在表结构里边定义自增)。
不要在字段里边自己定义字符集
字段和表要有comment
2、
首先明确规定:函数,触发器,视图,外键;所有逻辑业务上实现,尽量不使用存储过程,
a) 一定使用innodb 引擎,不允许用myisam。
b) 业务表设计时必须包含日期字段,createitme和lastupdatetime
每个表的update 语句,必须包含对 UpdateTime的更新
所有字段建议为not null , 时间类型必须为not null
c) 必须要有主键,主键尽量用自增字段类型,推荐类型为 INT或者 BIGINT类型。
d) 需要多表 join的字段,数据类型保持绝对一致。
e) 当表的字段数较多时,将表分成两张表,一张作为条件查询表,一张作为详细内容表。
f) 当字段的类型为枚举型或布尔型时,建议使用 tinyint类型。(不用char或者varchar)
3、
一定要整形ID作为主键(没有主键的表有严重性能问题)
字段类型越短越好
常见字段类型(一般不允许用text和blob),若必须使用则拆分到单独的表
尽量不要使用default null,字段都定义为:not null default ‘合理默认值’
4、
为什么字段类型越短越好(能用整形的尽量用整形,比如tiny代替char(1))等
1> 更少的存储空间
2>更少的磁盘IO
3> 更少的网络IO
4>更少的MySQL计算空间
5> 更少的APP计算空间
6>整形存储和运算代价比字符型小
有text字段的,最好请分表。(本质上说,不是mysql不适合存储text,而是在太多的情况下我们期望mysql能够更加高效的提供小数据查询/事务处理)
表字段数要少而精
5、
为什么必须有自增整形主键,一般该字段没有业务意义;少用唯一键。

6、
为什么尽量不要使用default null ?
1> 索引不会包括NULL值。影响索引的统计信息,影响优化器的判断。
2>复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。
3> 所以我们在数据库设计时不要让字段的默认值为NULL。
字段统一加上not null default ‘合理默认值’
7、
常见问题一——int(10)和int(2)区别
有别于char(x)和varchar(x),int(x)中的x表示的是整型(tinyint smallint mediumint int bigint)在添加了zerofill描述符后的显示宽度,所以在不添加zerofill描述符的时候,int(1) 和int(10) int(100) 都没什么区别。

8、
常见问题二——怎么存储IP
用什么字段类型存储IP,char(15),varchar(15)还是int unsigned?

9、
常见问题三——乱用字段类型
1>所有字符串都用varchar(255)------------>给合适长度就好
2>所有的数字都用bigint------->给合适类型,比如tinyint、smallint等
3>所有数字都用decmal-------->不精确值,可以使用其他浮点型,或者用整形来代替
二、索引
1、
开发人员要考虑到常用什么sql,一定要加上index。不能只是一个表只有一个主键。
● 不要修改聚集索引(主键)
为了维持B+tree会带来大量的数据移动,所以一般要求使用跟业务不相关的id做一个整形自增主键
● 索引不是越多越好,尽量合并索引
1>索引加快了查询度,但是却会影响写入性能。
2> 一个表的索引应该结合这个表相关的所有SQL综合创建,尽量合并。
3>组合索引的原则是,过滤性越好的字段越靠前。
例如key (a)和key(a,b)存在,那么key(a)可以删除了,对于select ……from tb where a=123;可以用到索引(a,b)
● 不要给选择性低的字段建单列索引
MySQL对索引的过滤性有要求,如果过滤性太低MySQL会放弃使用。
● 不要使用外键约束
1> 对性能损耗特别大。
2>让应用程序去维护约束。
● 字符类型字段尽量使用前缀索引
太长的索引不仅影响写入性能,而且使用效果也差,因此字符串类型字段一般只建前缀索引
alter table test_long_str add index idx_str(str(16));
● 合理使用复合索引
● LIKE查询的索引问题
like只能使用前缀索引,因此 :
1>col like "abc%" 能用上索引
2>col like "%abc%" 不能能用上索引
3>col like "%abc" 不能能用上索引
2、




三、SQL优化或规范






mysql设计表时注意事项的更多相关文章
- mysql 创建表时注意事项
mysql 创建表时注意事项 mysql 想必大家都不会陌生吧 是我学习中第一个接触的的数据库 已学习就很快上手的 这是一个关系型数据库 不懂什么是关系型数据库 啊哈哈哈 现在知道啦 因 ...
- mysql设计表时出错
source下面那个字段没有设置类型,类型为空
- oracle与mysql创建表时的区别
oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表CREATE TABLE predict_data as ( id integer ), mid ), time dat ...
- 解决MySQL联表时出现字符集不一样
mysql 建表时都会设置表的字符集和排序规则,通常是 utf8,不过我这边习惯建表的字符集是 utf8mb4,排序规则是 utf8mb4_unicode_ci.有些 utf8mb4 的表默认排序规则 ...
- MySQL 创建表时,设置时间字段自己主动插入当前时间
MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) N ...
- MySQL创建表时加入的约束以及外键约束的的意义
1,创建表时加入的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key 1,非空约束,针对某个字段设置其 ...
- MySQL设计表规范
规范总结 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字[设计表后逐一排查] 所有表必须使用 Innodb 存储引擎,数据库和表的字符集统一使用 ...
- mysql创建表时,设置timestamp DEFAULT NULL报错1067 - Invalid default value for 'updated_at'
问题背景: 线上的linux服务器上的mysql服务器中导出数据库的结构.想要在本地创建一个测试版本 导出后再本地mysql上运行却报错 1067 - Invalid default value ...
- (转)mysql创建表时反引号的作用
试用navicat工具查看现网mysql建表语句时,发现表名和字段名都是反引号引起来的 CREATE TABLE `tab_notice_title_tv` ( `i_id` int(11) NOT ...
随机推荐
- lucene相关
lucene相关: 应用领域: 互联网全文检索引擎(比如百度, 谷歌, 必应) 站内全文检索引擎(淘宝, 京东搜索功能) 优化数据库查询(因为数据库中使用like关键字是全表扫描也就是顺序扫描算法 ...
- VisualStuido C# Files 的值“<<<<<<< .mine”无效。路径中具有非法字符。
直接在项目中搜是搜不到<<<<<<.mine,可以直接删除obj文件夹.
- 钉钉C# 使用数据接口要注意的问题
1.钉钉的数据json全部使用的首字母小写的驼峰写法,如果首字母大写,将读取接口失败. 2.钉钉的文档同一个接口可能有simple和非simple两种写法,如果发现数据不全,可以把simple去掉试试 ...
- shell 命令使用笔记
1.提取字符串中以.ddd结尾的ddd值 result=$(echo "chip86.500" | grep -Eo '\.[0-9]{1,}' | grep -Eo '[0-9] ...
- Linux 查看系统版本和内核
查看系统内核版本 [root@11e71db4a00e /]# cat /proc/version Linux version -.el7.x86_64 (builder@kbuilder.dev.c ...
- Microsoft Windows .Reg File Dialog Box Message Spoofing 0day
Microsoft Windows .Reg文件对话框消息欺骗 0day 概述 扩展名为.reg的文件是Windows注册表中使用的注册文件.这些文件可以包含hives.密钥和值..reg文件可以在文 ...
- Excepting a "Mapping" node but got ... Ingnore "Except mapping" in project
问题 配置端口出现以下问题 问题原因: 解析失败 解决方式: 先将把application.yml 改为 application.properties, 再将端口号文件改为如下格式 解决
- 使用jQuery重置(reset)表单的方法
由于JQuery中,提交表单是像下面这样的: 代码如下: $('#yigeform').submit() 所以,想当然的认为,重置表单,当然就是像下面这样子喽: 代码如下: $('#yigeform' ...
- android SeekBar设置背景无法被填充满的bug
在做一个播放进度的时候,用到了SeekBar,调用布局如下: <SeekBar android:id="@+id/example_audio_bar" android:lay ...
- Python写一个京东抢券脚本
最近看到京东图书每天有优惠券发放,满200减100,诱惑还是蛮大的.反正自己抢不到,想着写个脚本试试. 几个关键步骤 获取优惠券的url 直接审查元素 获取cookie 通过本地代理,比如BurpSu ...