目录
1.字段类型选择注意事项:
1). 主键 使用bigint类型 选择snowflake建立全局唯一ID;
2). 能使用int类型的,尽量使用int类型。如“状态“,“代码” 选择SMALLINT类型;
3). 使用varchar类型的,可选择varchar(255);占用存储空间按实际长度+1
4). 货币类字段,使用Decimal和Numric类型表示,decimal(10,2) 共有10个数字,其中小数2位。存储空间10+2。java对应类型Bigdecimal, 加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide,比较大小用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示! 参见(https://blog.youkuaiyun.com/weixin_34007906/article/details/85991111)
(还可将币单位改为小单位,从而将小数转化为整数)。
5) 参见 Mysql的建表规范与注意事项 https://blog.youkuaiyun.com/w384694051/article/details/76998112
- 当字段可选择多个类型时(比如生日字段,可以用时间戳,即整数类型,可以用字符串 类型,也可以用日期 类型):整数、二进制 优于 日期 优于 字符串。
mysql字段类型与java类型对应表
MySQL Type Name | Return value ofGetColumnClassName | Returned as Java Class |
BIT(1) (new in MySQL-5.0) | BIT | java.lang.Boolean |
BIT( > 1) (new in MySQL-5.0) | BIT | byte[] |
TINYINT | TINYINT | java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, orjava.lang.Integer if not. |
BOOL, BOOLEAN | TINYINT | See TINYINT, above as these are aliases forTINYINT(1), currently. |
SMALLINT[(M)] [UNSIGNED] | SMALLINT [UNSIGNED] | java.lang.Integer (regardless if UNSIGNED or not) |
MEDIUMINT[(M)] [UNSIGNED] | MEDIUMINT [UNSIGNED] | java.lang.Integer, if UNSIGNEDjava.lang.Long |
INT,INTEGER[(M)] [UNSIGNED] | INTEGER [UNSIGNED] | java.lang.Integer , if UNSIGNEDjava.lang.Long |
BIGINT[(M)] [UNSIGNED] | BIGINT [UNSIGNED] | java.lang.Long , if UNSIGNEDjava.math.BigInteger |
FLOAT[(M,D)] | FLOAT | java.lang.Float |
DOUBLE[(M,B)] | DOUBLE | java.lang.Double |
DECIMAL[(M[,D])] | DECIMAL | java.math.BigDecimal |
DATE | DATE | java.sql.Date |
DATETIME | DATETIME | java.sql.Timestamp |
TIMESTAMP[(M)] | TIMESTAMP | java.sql.Timestamp |
TIME | TIME | java.sql.Time |
YEAR[(2|4)] | YEAR | If yearIsDateType configuration property is set to false, then the returned object type isjava.sql.Short . If set to true (the default) then an object of type java.sql.Date (with the date set to January 1st, at midnight). |
CHAR(M) | CHAR | java.lang.String (unless the character set for the column is BINARY, then byte[] is returned. |
VARCHAR(M) [BINARY] | VARCHAR | java.lang.String (unless the character set for the column is BINARY, then byte[] is returned. |
BINARY(M) | BINARY | byte[] |
VARBINARY(M) | VARBINARY | byte[] |
TINYBLOB | TINYBLOB | byte[] |
TINYTEXT | VARCHAR | java.lang.String |
BLOB | BLOB | byte[] |
TEXT | VARCHAR | java.lang.String |
MEDIUMBLOB | MEDIUMBLOB | byte[] |
MEDIUMTEXT | VARCHAR | java.lang.String |
LONGBLOB | LONGBLOB | byte[] |
LONGTEXT | VARCHAR | java.lang.String |
ENUM('value1','value2',...) | CHAR | java.lang.String |
SET('value1','value2',...) | CHAR | java.lang.String |
2.创建索引的注意事项
频繁作为查询条件的字段适合建立索引;
查询中与其它表关联的字段,外键关系建立索引;
单值和复合索引,优先选择复合索引;
查询中排序的字段,排序字段若通过索引去访问将大大提高查询速度;
查询中统计或者分组字段要建立索引;
where条件里用不到的字段不创建索引;
对于单键索引,尽量针对当前查询过滤性好的索引;
在选择组合索引的时候,当前查询中过滤性最好的字段在索引字段的顺序中,位置越靠前越好;
在选择组合索引的时候,尽量选择可以能够包含当前查询中的where子句中更多字段的索引;
尽可能通过分析统计信息和调整查询的写法来达到选择合适索引的目的;
频繁更新的字段不要建立索引;
3.使用索引要注意的事项
对于字符串索引,一定要加引号;
如果索引了多列,要遵循最佳左前缀原则;
不要在索引上做任何操作,会导致索引失效,而转向全表扫描;
存储引擎不能使用范围条件右边的列;
不等于、or都会使索引失效;