MySQl常见的存储引擎及区别
一、InnoDB
- 支持事务。
- 使用的锁粒度默认为行级锁,可以支持更高的并发;也支持表锁。
- 支持外键约束;外键约束其实降低的表的查询速度,增加了表之间的耦合度。
二、MyISAM
- 不提供事务支持。
- 只支持表级锁。
- 不支持外键。
三、memory
数据存储在内存中。
总结:
- MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中大量执行select操作,应该选择MyISAM。
- InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中大量insert和update操作,应该选择InnoDB。
MySQL建表时需要注意什么?
MySQL建表的经验较多,列举部分:
- 注意选择存储引擎,如果要支持事务选择InnoDB。
- 注意字段类型的选择,对一日期类型如果要记录时分秒建议使用datetime,只记录年月日使用date类型;对于字符类型的选择,固定长度字段选择char,不固定长度的字段选择varchar,varchar比char节省空间但速度没有char快;对于内容介绍类的长文本字段使用text或longtext类型;如果存储图片等二进制数据使用blob或longblob类型;对金额字段建议使用decimal;对于数值类型的字段在确保取值范围足够的前提下尽量使用占用空间较小的类型。
- 主键字段建议使用自然主键,不要有业务意义,建议使用int unsigned类型,特殊场景使用bigint类型。
- 如果要存储text、blob字段建议单独建一张表,使用外键关联。
- 尽量不要定义外键,保证表的独立性,可以存在外键意义的字段,也就是说不要使用物理外键,尽量使用逻辑外键。
- 设置字段默认值,比如:状态、创建时间等。
- 每个字段写清楚注释。
- 注意字段的约束,比如:非空、唯一、主键等。
- 字段唯一约束的话,该表有逻辑删除,那需要注意逻辑删除的唯一字段。
MySQL与Java数据类型对应关系
| 类型名称 | 显示长度 | 数据库类型 | JAVA类型 | JDBC类型索引(int) |
|---|---|---|---|---|
| VARCHAR | L+N | VARCHAR | java.lang.String | 12 |
| CHAR | N | CHAR | java.lang.String | 1 |
| BLOB | L+N | BLOB | java.lang.byte[] | -4 |
| TEXT | 65535 | VARCHAR | java.lang.String | -1 |
| INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 |
| TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 |
| SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 |
| MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 |
| BIT | 1 | BIT | java.lang.Boolean | -7 |
| BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 |
| FLOAT | 4+8 | FLOAT | java.lang.Float | 7 |
| DOUBLE | 22 | DOUBLE | java.lang.Double | 8 |
| DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 |
| BOOLEAN | 1 | 同TINYINT | ||
| ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 |
| DATE | 10 | DATE | java.sql.Date | 91 |
| TIME | 8 | TIME | java.sql.Time | 92 |
| DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 |
| TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 |
| YEAR | 4 | YEAR | java.sql.Date | 91 |