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优化或规范

原文地址:https://www.cnblogs.com/zhangwuji/p/8110916.html

时间: 2024-08-28 20:33:53

mysql设计表时注意事项的相关文章

Mysql 建表时,日期时间类型选择

mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  DATETIME  8 bytes  YYYY-MM-DD HH:MM:SS  1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00  TIMESTAMP  4 bytes  YYYY-MM-DD HH:MM:SS  197001010

(转)mysql创建表时反引号的作用

(转)mysql创建表时反引号的作用 试用navicat工具查看现网mysql建表语句时,发现表名和字段名都是反引号引起来的 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE `tab_notice_title_tv` (   `i_id` int(11) NOT NULL AUTO_INCREMENT,   `c_opcom_key` varchar(32) DEFAULT NULL,   `c_view_type` int(11) DEFAULT '1' COMMEN

MySQL 创建表时,设置时间字段自己主动插入当前时间

MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) NOT NULL, `CURRENT_TIME` timestamp not null default current_timestamp, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

oracle与mysql创建表时的区别

oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表CREATE TABLE predict_data as ( id integer NOT NULL, uid varchar2(80), mid varchar2(80), time date , content varchar2(300), constraint predict_data primary key (id) );#字段注释comment on table predict_data is '预测表';

解决MySQL联表时出现字符集不一样

mysql 建表时都会设置表的字符集和排序规则,通常是 utf8,不过我这边习惯建表的字符集是 utf8mb4,排序规则是 utf8mb4_unicode_ci.有些 utf8mb4 的表默认排序规则是 utf8mb4_general_ci,导致在联表操作时会报错误: Illegal mix of collations 其实这个就是联表时由于表的排序规则不一致才会引起的,这个可以通过将表的排序规则改成一致来解决. 但是有时表已经在线上了,无法修改,而现在又要急着用,可以通过下面的方法: UPDA

MySQL 创建表时,设置时间字段自动插入当前时间

MySQL 创建表时,设置时间字段自动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) NOT NULL, `CURRENT_TIME` timestamp not null default current_timestamp, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql创建表的注意事项

1 库名,表名,字段名必须使用小写字母,"_"分割. 2 库名,表名,字段名必须不超过12个字符. 3 库名,表名,字段名见名识意,建议使用名词而不是动词. 4 建议使用InnoDB存储引擎.( InnoDB:支持事务安全的引擎,支持外键.行锁.事务是他的最大特点.如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况.) 5 存储精确浮点数必需使用DECIMAL替代FLOAT和DOUBLE.( float,double容易产生误差,对精确度

MySQL建表时列名同保留字重复问题解决办法

建表时遇到遇到属性名同MySQL的保留字相同导致不能建表的问题,如下SQL语句: CREATE TABLE TBL_ACCOUNT_FROZEN_RECORD ( ID BIGINT NOT NULL AUTO_INCREMENT, TRADE_FLOW_ID VARCHAR(60) NOT NULL, ACCOUNT_NO VARCHAR(32) NOT NULL, INITIATOR VARCHAR(16) NOT NULL, OPERATE_TYPE VARCHAR(32) NOT NUL

mysql关键字--设计表时要避开,否则回报语法错误

https://dev.mysql.com/doc/refman/5.7/en/keywords.html#keywords-in-current-series Keywords and Reserved Words A ACCESSIBLE (R) ACCOUNT; added in 5.7.6 (nonreserved) ACTION ADD (R) AFTER AGAINST AGGREGATE ALGORITHM ALL (R) ALTER (R) ALWAYS; added in 5.