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表。

分享到:

2012-07-05 20:27

浏览 595

分类:数据库

评论

mysql建表字段属性为clob_MySQL建表的优化策略相关推荐

  1. mysql建表字段不能重复_MySQL建表的一些约束条件

    1.SQL :结构化查询语言(Structer Query Language) 包含DDL,DCL ,DML,TCL四种语句 DDL:create / alter / drop DCL: grant ...

  2. mysql user表字段详解_Mysql User表权限字段说明全介绍

    下文对Mysql User表权限字段进行了全部的详细说明,供您参考学习,如果您对Mysql User表权限字段不是很了解,不妨一看,相信对您会有所启迪. Select_priv:确定用户是否可以通过S ...

  3. NAVICAT MYSQL 建表字段 默认值、EMPTY STRING、空白、NULL 的区别

    Navicat mysql 建表字段 默认值.empty string.空白.NULL 的区别 总结在最后,没啥干货 简单测试了4种类型 bigint tinyint varchar char 单引号 ...

  4. SQL建表字段语法DEFAULT和字段 NULL的组合定义表现

    SQL建表字段语法DEFAULT 和 字段 NULL的组合定义表现 drop TABLE [dbo].[Ap_testtmp] go CREATE TABLE [dbo].[Ap_testtmp]( ...

  5. php mysql 表字段_php mysql获取表字段名称和字段信息的三种方法

    php mysql获取表字段名称和字段信息的三种方法 先给出本实例中使用的表的信息: 使用desc获取表字段信息 php代码如下: mysql_connect("localhost" ...

  6. mysql 单表字段多少合适_复制信息记录表|全方位认识 mysql 系统库

    在上一期<时区信息记录表|全方位认识 mysql 系统库>中,我们详细介绍了mysql系统库中的时区信息记录表,本期我们将为大家带来系列第七篇<复制信息记录表|全方位认识 mysql ...

  7. mysql数据库表字段使用DESC等关键字报错及解决方法

    mysql数据库表字段使用DESC等关键字报错及解决方法 参考文章: (1)mysql数据库表字段使用DESC等关键字报错及解决方法 (2)https://www.cnblogs.com/li--xi ...

  8. 查询数据库表字段属性

    查询表字段属性 Mysql Oracle SqlServer PostgreSql Sqlite hive 深度解析 标准 Mysql 1 获取当前数据库 Oracle 1.oracle 获取当前用户 ...

  9. mysql 表字段信息从一张表迁移到另一张表_MySQL(数据库)笔记

    ###数据库 之前通过流去操作文件保存数据库的弊端: 1.执行效率低 2.开发成本高 3.一般只能保存小量数据 4.只能保存文本数据 ####什么是DB - DataBase 数据库:代表文件集合 # ...

最新文章

  1. vector机器人 叫 hey vector时 识别率不高 解决方法
  2. Java程序员须知:分布式微服务为什么很难?
  3. 腾讯朱华:数据中心下一个风向的探索
  4. 剑指offer之 旋转数组的最小数字
  5. wangeditor html编辑,Vue整合wangEditor富文本编辑器
  6. 数列分段(洛谷P1181题题解,Java语言描述)
  7. Python入门:ChainMap 有效管理多个上下文
  8. 毫秒数据字符串转换为DateTime
  9. Win10不能直接拖文件/Foxmail不能拖文件解决办法
  10. linux编写的员工管理系统,员工信息管理系统设计与实现(叶晖).doc
  11. 关于使用VS2015编译项目时出现LNK1112 module machine type 'x64' conflicts with target machine type 'X86'
  12. 介绍一款rar文件密码破解利器——RAR Password Unlocker
  13. PostgreSQL数据库备份还原全攻略
  14. 来自腾讯的高性能服务器架构思路
  15. 凤天赛磁石墨烯植物复合机油
  16. win10taskkill强行结束进程_win10强制关闭进程快捷键
  17. enoent ENOENT: no such file or directory,
  18. 没想到,买了这款不靠谱的达尔文重疾险易核版,成了他一生的噩梦
  19. oracle中numeric是什么类型,numeric
  20. 关于STM32的jlink仿真器突然不能工作的解决方法

热门文章

  1. 从零开始学习-python的应用范围
  2. python实现登录支付宝收能量_玩了200天的“蚂蚁森林”,发现果然是支付宝最懂人性,马云厉害...
  3. observable java_Java Observable 模式
  4. java Mail imap协议获取到得邮件文件夹名称
  5. 融云艾瑞发布《政企数智办公平台行业研究报告》,解读数智化时代的办公新趋势
  6. (五)路由器破密码和重置
  7. 你有没有想过把创业构想让企业来帮你实现
  8. 【二维练习】多段线PL命令绘制“雨伞”
  9. 剑与家园服务器总是维护,新人经常被点?浅谈剑与家园游戏保护机制
  10. python内置函数什么可以返回列表、元组_Python内置函数_________可以返回列表、元组、字典、集合、字符串以及range对象中元素个数。...