`

MySQL建表的优化策略

 
阅读更多

MySQL 建表的优化策略

目录
1. 字符集的选择 1
2. 主键 1
3. 外键 2
4. 索引 2
4.1. 以下情况适合于创建索引 2
4.2. 以下的情况下不适合创建索引 3
4.3. 联合索引 3
4.4. 索引长度 4
5. 特殊字段 4
5.1. 冗余字段 4
5.2. 分割字段 4
5.3. BLOB和CLOB 5
6. 特殊 5
6.1. 表格分割 5
6.2. 使用非事务表类型 5

1. 字符集的选择
如果确认全部是中文,不会使用多语言以及中文无法表示的字符,那么GBK是首选。
采用UTF-8编码会占用3个字节,而GBK只需要2个字节。
2. 主键
尽可能使用长度短的主键
系统的自增类型AUTO_INCREMEN, 而不是使用类似uuid()等类型。如果可以使用外键做主键,则更好。比如1:1的关系,使用主表的id作为从表的主键。
主键的字段长度需要根据需要指定。
tinyint 从 2的7次方-1 :-128 到 127
smallint 从 2的15次方-1 :-32768 到 32767
mediumint 表示为 2的23次方-1: 从 -8388608 到8388607
int 表示为 2的31次方-1
bigint 表示为 2的63次方-1

在主键上无需建单独的索引,因为系统内部为主键建立了聚簇索引。
允许在其它索引上包含主键列。
3. 外键
? 外键会影响插入和更新性能,对于批量可靠数据的插入,建议先屏蔽外键检查。
? 对于数据量大的表,建议去掉外键,改由应用程序进行数据完整性检查。
? 尽可能用选用对应主表的主键作作为外键,避免选择长度很大的主表唯一键作为外键。
? 外键是默认加上索引的
4. 索引
创建索引,要在适当的表,适当的列创建适当数量的适当索引。在查询优先和更新优先之间做平衡。
4.1. 以下情况适合于创建索引
? 在经常需要搜索的列上,可以加快搜索的速度
? 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
? 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
? 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
? 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间
? 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

4.2. 以下的情况下不适合创建索引
? 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
? 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
? 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。
? 如果表数据很少,比如每个省按市做汇总的表,一般低于2000,且数据量基本没有变化。此时增加索引无助于查询性能,却会极大的影响更新性能。

? 当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当对修改性能的要求远远大于检索性能时,不应该创建索引。
4.3. 联合索引
? 在特定查询里,联合索引的效果高于多个单一索引,因为当有多个索引可以使用时,MySQL只能使用其中一个。
在查询里,同时用到了联合索引包含的前几个列名,都会使用到联合索引,否则将部分或不会用到。比如我们有一个firstname、 lastname、age列上的多列索引,我们称这个索引为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用 fname_lname_age索引:
firstname,lastname,age
firstname,lastname
firstname
从另一方面理解,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。
4.4. 索引长度
? 对于CHAR或者Varchar的列,索引可以根据数据的分布情况,用列的一部分参与创建索引。
create index idx_t_main on t_main(name(3));
这里就是指定name的前三个字符参与索引,而不是全部
? 最大允许的长度为1000个字节,对已GBK编码则是500个汉字
5. 特殊字段
5.1. 冗余字段
就是用空间换取时间。如果大表查询里经常要join某个基础表,且这个数据基本不变,比如人的姓名,城市的名字等。一旦基础表发生变动,则需要更新所有涉及到的冗余表。
5.2. 分割字段
如果经常出现以某个字段的某个局部进行检索和汇总(substring()),可以考虑将这一部分独立出来。
比如统计姓名里,每种姓氏的人数,可以考虑实现就按照姓和名分别保存,而不是一个字段。
还有就是某些上下级结构的实现,也可以考虑将不同的级别放在不同的字段里。
5.3. BLOB和CLOB
此类字段一般数据量很大,建议设计上数据库可以只保存其外部连接,而数据以其它方式保存,比如系统文件。
6. 特殊
6.1. 表格分割
如果一个表有许多的列,但平时参与查询和汇总的列却并不是很多,此时可以考虑将表格拆分成2个表,一个是常用的字段,另一个是很少用到的字段。
6.2. 使用非事务表类型
? MySQL支持多种表类型,其中InnoDB类型是支持事物的,而MyISAM类型是不支持的,但MyISAM速度更快。对于某些数据,比如地理行政划分,民族等不可能参与事务的数据,可以考虑用MyISAM类型的表格。
? 但InnoDB的表,将无法用MyISAM表数据做外键约束了。
? MyISAM表参与的事务,其InnoDB表可以正常的提交和回滚,但不影响MyISAM表。

分享到:
评论

相关推荐

    java实体转mysql建表语句

    为了从Java实体类自动生成MySQL建表语句,开发者可以使用一些工具或库,如`JPA`的`Metamodel`API,或者开源项目如`MyBatis Generator`。这些工具能够解析Java源代码,从中提取实体类信息并生成相应的SQL语句。 4. ...

    MySQL 建表的优化策略 小结

    MySQL数据库建表的优化...总的来说,MySQL建表优化策略涉及字符集选择、主键与外键设计、索引管理、特殊字段处理等多个方面。在实践中,应综合考虑数据量、查询模式、更新频率等因素,做出最适合当前业务需求的决策。

    mysql建表语句.zip

    综上所述,“mysql建表语句.zip”中的内容可能涵盖了如何为大数据环境设计高效的 MySQL 表结构,包括但不限于字段定义、主键和索引的设置、数据分区策略等。这些知识点对于千亿级数仓项目的实施至关重要,确保数据的...

    Mysql转oracle工具

    在转换过程中,可能需要将MySQL的数据分布策略转换为Oracle的表空间或分区策略。 5. **索引和约束**: MySQL与Oracle的索引类型和约束定义(如主键、外键)也有所不同,转换时需要注意。 6. **存储过程和函数**:...

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

    9. **优化与调整**:转换后的Oracle表可能需要根据Oracle的最佳实践进行一些调整,如分区策略、索引优化等。 总的来说,这个过程涉及到数据库设计、SQL语法理解和自动化脚本编写。对于大型或复杂的数据库迁移,可能...

    mysql语句转postgres的工具

    2. **性能评估**:PostgreSQL可能有不同的性能优化策略,迁移后可能需要调整索引、分区、缓存等设置。 3. **应用程序修改**:如果应用程序直接与数据库交互,可能需要对SQL查询进行相应调整,以适应PostgreSQL的...

    数据库转换工具MySQL 转为SqlServer 脚本

    7. **性能优化**:转换后的SQL Server数据库可能需要进行一些性能优化,如调整索引、分区策略、内存配置等,以适应新的环境。 8. **安全考虑**:迁移过程中要注意权限和角色的映射,确保用户访问控制的平滑过渡。 ...

    总结MySQL建表、查询优化的一些实用小技巧

    MySQL数据库在设计和使用过程中,建表和查询优化是至关重要的环节,良好的表结构和优化的查询策略能够显著提升数据库的性能和效率。以下是一些实用的小技巧: **技巧一:冗余记录添加时间和更新时间** 在设计数据表...

    以mysql为主,记录数据库的建表规范及优化方案等

    本文将深入探讨MySQL的建表规范以及优化方案,帮助你提升数据库性能和管理效率。 一、数据库建表规范 1. **合理设计数据类型**:选择合适的数据类型是优化数据库的基础。例如,对于整数类型,应根据实际范围选择...

    mysql数据库转换成sql server

    - **索引和查询优化**:SQL Server可能需要不同的索引策略和查询优化技术,迁移后可能需要重新评估和调整。 7. **日志和备份**: - **SQL Server的日志和备份机制**:SQL Server有其独特的日志和备份系统,需要...

    mysql、posrgresql转成clickhouse db工具sync-master

    - **性能优化**:ClickHouse的设计倾向于处理大量数据的分析,而非事务处理,所以在设计表结构时,应考虑到ClickHouse的特性,如分区策略、索引优化等。 - **权限管理**:确保迁移过程中对源数据库和目标数据库的...

    Mysql建表与索引使用规范详解

    以下是根据提供的标题、描述和部分内容总结的MySQL建表与索引使用规范: 1. **字段设置**: - 非空约束:为了确保数据完整性,字段应尽可能设置为非空,并设定默认值。 - NULL值处理:如果允许字段为NULL,同样应...

    生成hive建表语句

    在生成Hive建表语句时,需要根据实际需求选择合适的字段类型、分区策略、存储格式等,确保数据的有效存储和高效查询。同时,建表语句的设计应考虑数据的扩展性和维护性,以适应业务的变化和发展。在实际工作中,我们...

    2015年辛星MySQL教程第四本优化建模

    这本教程旨在帮助读者深入理解MySQL数据库的优化策略及如何高效地进行数据库建模。 #### 二、教程目标与特点 **目标**: - **传播知识**:通过详细阐述MySQL优化与建模的相关概念和技术,帮助读者掌握核心技能。 -...

    MySQL大表性能优化方案 和 MySQL高性能表设计规范

    本篇文章将深入探讨针对MySQL大表的性能优化策略以及如何遵循高性能的表设计规范。 一、MySQL大表性能优化方案 1. **分区表**:当单个表的数据量过大时,可以采用分区技术,将数据分散到多个物理存储单元,提高...

    mysql .pdf建表的一些规则 和注意事项

    ### MySQL建表规则与注意事项详解 #### 一、命名规则 **1.1 库名与应用名称一致性** - **推荐做法**:建议数据库的名字与应用程序的名称保持一致,这样可以便于开发人员理解和记忆,同时也方便后期维护。 **1.2 ...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    14-MySQL建表语句及表的知识.avi 15-查看表结构以及建表语句.avi 16-索引的知识及索引创建多种方法实战.avi 17-索引生效的基本条件说明.avi 18-主键-唯一-普通索引创建及删除小结.avi 19-DML语句之insert知识讲解....

    mysql雪花算法生成唯一整型ID主键的实现方法

    MySQL 雪花算法生成唯一整型ID主键的实现主要针对...但需要注意的是,这种方法在高并发场景下可能会面临锁竞争问题,因此在实际应用中需要根据业务需求进行优化,如增加序列步长(increment)或采用其他并发控制策略。

Global site tag (gtag.js) - Google Analytics