`

关于MySQL表设计应该注意的问题

阅读更多

1、慎重选择表名。

有两种选择:

按照多数开发语言的命名规则。比如(myCustomer)。

按照多数开源思想命名规则。比如(my_customer)。

按照咱们中国人的思想。比如(我的客户)。

第一种有个缺点,很容易忘掉大写的字母。

第二种则比较好,每个WORD间用下划线连接,避免遗忘。

第三种建议不要用,虽然很好记。不觉得解析这个表的时候还需要编码转化吗?我个人理解,大家可以补充。

2.  关于编码的设定。

A.             GBK/GB2312.(适用于纯中文存储)。

B.           UTF8.(适用于中英文混合存储)。

C.            LATIN1。(适用于纯英文存储)。

D.     其他的。

3. 关于表引擎的选择。

A.                 MYISAM.(很多人说她的表级锁定会带来好多问题,其实只要设计好对应的表以及写好对应的SQL查询就没有那么大的问题。)

B.                  INNODB. (如果要用到事务,选择她不会错。至于多数人讲的MASTER/SLAVE结构上用INNODBMASTER的选择是否正确,就要看你怎么用了。不能一味的疯狂使用INNODB。除非你想要确保非常高可用性,

C.                  CSV. (以前我写过文章,关于这个引擎。个人觉得最主要的是来存储少量数据以及从EXCELMYSQL的转换方面会很有用。当然只要涉及到规则数据的导入,她就可以办到。)

D.                  BLACKHOLE. (觉得最完美的用处在于MASETR/SLAVE上面,并且MASTER是一个临时的专门负责写的机器。不过缺点也很多,会与MYISAM或者INNODB或者其他的引擎有所冲突,这点自己要做个权衡)。

E.                   MEMORY. (应该说是MYISAM的兄弟了。不过在读内存总比读磁盘的速度要快。不过要注意,它不支持动态数据类型)。

F.                   FEDERATED. (典型的分布式引擎。我以前文章中有介绍。)

G.    NDB。(网络版存储引擎。因为Replication 总是有延迟,所以如果系统容不得任何延迟,就用这个吧。)
   H.    FOLCON。(6.0后用来代替INNODB的引擎。)

I.                  其他旧的以及新开发的引擎具体介绍:http://dev.mysql.com/doc/refman/6.0/en/storage-engines.html)。

4. 关于属性数据类型的选择。

A.                  INT(一个字节的TINYINT,两个字节的SMALLINT,三个字节的MEDIUMINT,四个字节的INT8个字节的BIGINT。记住:UNSIGNED不管你定义或者不定义,都不影响内部的存储字节大小)

B.                   少于10个字符用CHAR是在合适不过了。(不过要记住在MEMORY引擎里面会自动把VARCHAR转化为CHAR)

C.                   我一般用DECIMAL或者NUMERIC来代替FLOAT 或者DOUBLE。因为老板要求精确的数字。如果不要求精确的,那就用FLOAT吧。速度快,占空间小。(DECIMAFLOAT(P)是动态存储。比如:DECIMAL(10,2)占用5个字节。FLOAT4个字节,)

D.                 BLOBTEXT,VARCHAR(一般存放文章内容,特别是新闻网站。需要的字节数是所存储的字符长度+1。记住BLOB和VARCHAR是TEXT和CHAR的BINARY类型)

E.                   ENUM(在一定范围内绝佳的代替VARCHARCHAR的工具,因为她只占一到两个字节。)

F.                   时间和日期类型(占3个字节的DATE8个字节的DATETIME4个字节的TIMESTAMP3个字节的TIME1个字节的YEAR。)。如果要存储比如‘1983’这样的年份,用YEAR明显比VARCHAR或者CHAR要节省空间。因为后者要占5个字节。

G.                  BOOLEAN(用来存储YES或者NO之类的值,占用一个字节。)

H.                  关于自增字段。目前我们的项目中涉及到好多ORDER BY RAND()操作。此类语句在数据库并发大的时候会造成CPU严重阻塞,持续产生数据库死锁!解决此类问题最好的办法就是利用自增字段,用程序随即生成数字序列,或者在数据库端随即生成数字序列。

I.                    关于ZEROFILL。非常好用的前置填补0的存储,而不是用用对应个数的空串来代替。在需要前置补零的操作中INT ZEROFILL可以用来代替CHAR或者VARCHR

5.  关于默认值。

A.                  5.0之后,只要设定字段为NOT NULL,系统自动给出默认值。对应CHAR->’’,INT->0,BOOLEAN->0等等。

B.                   5.0之前的版本,需要手动指定默认值,否则会出现一定的异常。到时候查都不好查了。

6.  关于多数据库建立。

A.                  应该把对应的业务放在各自不同的数据库里,而不是所有业务放到一个库里面。

B.                   数据库的命名和表命名一样。

7.  关于索引。

A.                  设计表初期尽量考虑到应该建立的索引。所有建立的索引一定要测试一下,看是否有必要,否则会翻倍的减少写数据的性能。

B.                   对于只有存储0或者1的列,尽量干掉索引,单独分出两个表。一个代替0,另外一个代替1。或者在一个字段里面用EMUM或者CHAR(0)或者CHAR(1)来代替。

   PS: 最后一个要值得注意的,就是尽量所有的字段用NOT NULL。虽然MYSQL可以对NULL列进行索引,不过我不建议。
分享到:
评论

相关推荐

    MYSQL数据库优化与表设计

    5. **表设计注意事项**: - 行长度不超过8020字节,以避免存储碎片和降低查询效率。 - 尽量使用数字类型而非字符串类型,以提高查询性能和减少存储开销。 - 在选择CHAR和VARCHAR类型时,根据字段的实际需求进行...

    mysql数据库设置外键应该注意的几点

    在MySQL数据库中,外键是实现表间关系的重要机制,它确保了数据的一致性和完整性。设置外键时,有几点需要注意,以确保数据库设计的规范性和高效性。以下是对这些关键点的详细阐述: 1. **外键约束定义**: 外键是...

    从excel模版生成数据库表DDL,excel设计mysql,excel设计表格模板转成mysql表文件,

    然而,也需要注意数据类型和约束的兼容性问题,因为Excel的数据格式与MySQL的可能有所不同,需要在转换过程中进行适当的映射和验证。 此外,这种方法可能会忽略一些数据库设计的最佳实践,例如索引优化、范式理论的...

    phpmysql网站设计

    此外,还需注意SQL注入的安全问题,通过预处理语句或参数化查询来防止恶意输入。 网站设计还包括前端界面的创建,通常使用HTML、CSS和JavaScript。HTML定义网页内容结构,CSS负责样式设计,JavaScript处理客户端...

    用power Designer生成mysql表关系视图的方法

    在介绍如何使用Power Designer工具生成MySQL数据库表关系视图之前,我们需要了解Power Designer和MySQL的ODBC驱动的背景知识。 Power Designer是一款由Sybase公司开发的强大的数据库设计工具,它支持数据建模,从...

    MySQL数据库设计、优化

    通过对MySQL数据库的设计和优化规范的学习,我们可以了解到如何合理地规划数据库的各个方面,包括基础规范、命名规范、库表规范和字段规范等。这些规范的制定旨在提高数据库的整体性能,降低运维成本,并增强系统的...

    mysql问题,常见的mysql面试问题

    ### MySQL常见面试问题详解 #### 1. MySQL简介与特性 - **MySQL**:MySQL是一种关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前由Oracle公司维护。它以其高性能、高可靠性和易用性著称,在互联网行业...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    8. **注意事项**:数据迁移时需考虑字符集兼容性,因为MySQL和Oracle可能使用的字符集不同,可能导致编码问题。 9. **优化与调整**:转换后的Oracle表可能需要根据Oracle的最佳实践进行一些调整,如分区策略、索引...

    Mysql数据库设计标准

    MySQL数据库设计标准是确保数据一致性、可靠性和高效性的重要指南,它涵盖了多个方面,包括概念设计、逻辑设计和物理设计。以下是对这些关键知识点的详细解释: 1. **概念设计**: - 实体关系模型(ER模型):在...

    常用的三个mysql表

    以上就是关于“常用的三个MySQL表”的基本知识。通过理解这些表的设计原理和使用方法,可以为初学者提供一个良好的起点,进一步深入学习MySQL数据库管理。在实际应用中,还会遇到更多复杂的情况,如视图、存储过程、...

    创建mysql表分区的方法

    【MySQL 表分区详解】 ...综上所述,MySQL表分区是大数据场景下的有力工具,通过合理设计和使用,可以显著提升数据库的性能和管理效率。在实际应用中,应结合业务需求和查询模式选择合适的分区策略。

    Oracle数据库表转换为Mysql

    "Oracle数据库表转换为Mysql" Oracle数据库表转换为Mysql是指将Oracle数据库中的表结构转换为Mysql...但是在转换过程中,需要注意表结构的更改、数据长度的限制和用户权限的处理等问题,以确保转换的正确性和安全性。

    MySQL 数据库设计实践

    ### MySQL 数据库设计实践 #### 一、MySQL介绍 MySQL是一种关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。它以其高性能、高可靠性和易用性而受到广泛欢迎,尤其适合Web应用程序。 - **连接...

    45-MySQL单表2000万数据查询慢解决方案1

    本文主要讨论了如何解决MySQL单表2000万数据查询慢的问题,通过将表分区和使用时间触发器来实现数据的优化。 分区设计 在解决方案中,我们使用的是按照8周将单表分为8个区,每周一都会将最早一周的分区Drop掉,然后...

    MySQL锁类型以及子查询锁表问题、解锁1

    在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...

    MYSQL

    10.2.7 MySQL 怎样使用内存 10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度 10.5.1 估计...

    MySQL保存emoji表情

    因此,在设计与无线互联网相关的MySQL数据库时,推荐采用UTF-8mb4字符集来确保能够妥善处理emoji表情符号,避免出现数据存储或显示上的问题。 #### 限制 使用UTF-8mb4字符集的前提条件包括: - MySQL服务器版本需...

    oracl转mysql注意事项

    - **问题描述**:MySQL导入时,需要注意表、函数、事件等的导入顺序,尤其是依赖于其他对象的视图。 - **解决方案**:先导入表、函数和事件,最后导入视图。确保视图的创建不会因为依赖关系未满足而失败。 **6. 大...

    mysql操作常用问题解决

    以上就是关于"mysql操作常用问题解决"的一些关键知识点,涵盖了MySQL数据库的基础使用、管理、优化和故障排查等方面,对于日常操作和维护MySQL数据库非常有帮助。通过学习和实践这些内容,可以有效地提升MySQL数据库...

Global site tag (gtag.js) - Google Analytics