表的优化与列类型选择

列选取原则####

1、字段类型优先级

整型 > date,time > char,varchar > blob

因为 整型,time运算快,节省空间,char/varchar要考虑字符集的转换与排序时的校对集,速度慢,blob无法使用内存临时表

列的特点分析:

整型: 定长,没有国家/地区之分,没有字符集的差异

time: 定长,运算快,节省空间. 考虑时区,写sql时不方便 where > ‘2005-10-12’;

enum: 能起来约束值的目的, 内部用整型来存储,但与char联查时,内部要经历串与值的转化

char: 定长, 考虑字符集和(排序)校对集

varchar: 变长 要考虑字符集的转换与排序时的校对集,速度慢.

text/Blob:无法使用内存临时表

2、长度够用就行,不要慷慨(如smallint,varchar(N))

大的字段浪费内存,影响速度

以年龄为例 tinyint unsigned not null ,可以存储255岁,足够. 用int浪费了3个字节

以varchar(10) ,varchar(300)存储的内容相同, 但在表联查时,varchar(300)要花更多内存

3、尽量避免使用null

null不利于索引,要用特殊的字节来标注,在磁盘上占据的空间其实很大

实验:

建立两张字段相同的表,一个允许为null,一个不允许为null,录入相同的数据,使用explain查看索引文件的大小

create table t3(

-> name char(1) not null default '',

-> key(name)

-> )engine myisam charset utf8;

create table t4(

-> name char(1),

-> key(name)

-> )engine myisam charset utf8;

insert into t3 values('a'),('');

insert into t4 values('a'),(null);

explain select * from t3 where name='a';

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: t3

type: ref

possible_keys: name

key: name

key_len: 3

ref: const

rows: 1

Extra: Using where; Using index

1 row in set (0.03 sec)

explain select * from t4 where name='a';

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: t4

type: ref

possible_keys: name

key: name

key_len: 4

ref: const

rows: 1

Extra: Using where; Using index

1 row in set (0.00 sec)

比较两张表的key_len,可以发现允许null值的t4表的key_len要长于t3表,这是因为使用null之后,表要多储存一个字节,用来区分是否是null,另外null所占用的空间较大。

**还有一点就是,null不便于查询,where 列名 = null 和 where 列名 != null 都查询不到值,需要使用 where 列名 is null 或者 where 列名 is not null

enum列的说明

1、enum列在内部是用整型来存储的

2、enum列与enum列相关联速度最快

3、enum列比(var)char的弱势--在碰到与char关联时,要转换,花费时间

4、优势在于,当char非常长时,enum依然是整型固定长度,当查询的数据量越大时,enum的优势越明显

5、enum与char/varchar关联,因为要转换,速度要比enum->enum,char->char要慢,但有时也可以这样用--就是在数据量特别大的时候,可以节省IO

create table t5(

-> gender enum('male','female') not null default 'male'

-> )engine myisam charset utf8;

insert into t5 values('male'),('female');

+--------+

| gender |

+--------+

| male |

| female |

+--------+

select gender+0 from t5

+----------+

| gender+0 |

+----------+

| 1 |

| 2 |

+----------+

mysql stack is full_mysql优化之表的优化与列类型选择相关推荐

  1. mysql 建表 日期格式_MySQL建表时,日期时间类型选择

    MySQL(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DA ...

  2. mysql 结构优化建议_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...

    殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...

  3. mysql性能调优与架构设计 51cto_MySQL 数据库性能优化之表结构优化

    很多人都将 数据库设计范式 作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉 ...

  4. mysql 优化表_mysql里sql优化和表结构优化

    开启慢查询日志 计入sql show variables like 'slow_query_log';//慢查询查看状态 OFF未开启 ON开启 show variables like '%log%' ...

  5. mysql 大表更新数据类型_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...

    殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...

  6. 【MySQL:视频笔记1】slq基本语句和列类型

    安装MySQL 执行mysql语句报错:'mysql'不是内部或外部命令,也不是可运行的程序或批处理文件. 原因: 执行 以上 mysql命令时,实际为系统调用了 mysql.exe 文件.该文件在m ...

  7. mysql并行加载机制_Mysql表引擎优化

    http://blog.csdn.net/naughty610/article/details/7464794 MyISAM: 第一,优化参数 这个表引擎只存储索引的缓存,而不存储数据的缓存.可以通过 ...

  8. mysql 左连接 去重复,MySQL删除左连接,3个表上的重复列

    我有三个表,每个表都有一个外键.当我执行连接时,我得到重复的列. 特定 mysql> describe Family; +---------------+-------------+------ ...

  9. 数据库优化:表的优化

    一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果. 需要考虑数据冗余.查询和更新的速度.字段的数据类型是否合理等多方面的内容. 1. 将字段很多的表分解成多个表(垂直分割) 对于字段较多 ...

最新文章

  1. 如何破解安卓手机上的图形锁(九宫格锁)
  2. 学习笔记——matplotlib学习
  3. Java的标签--弱化的goto
  4. c++中介者模式mediator
  5. linux下raid5的配置
  6. 一道很简单的贪心算法题~【贪心:我不要脸的伐?】
  7. Ubuntu和window10 安装双系统
  8. 使用Filter防止浏览器缓存页面或请求结果
  9. ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference
  10. 华为NP课程笔记23-VRRP
  11. 【自撰】Redis客户端Jedis
  12. 工控领域国际品牌的市场兼并
  13. HTML+CSS+JS在线客服对话框迷你版
  14. 抓包发现tcp会话中老是出现重复的ack和大量的tcp重传——SACK(Selective Acknowledgment, 选择性确认)技术
  15. javascript数字转汉字中文数字
  16. 虚拟专用网和IPv6路由配置【Cisco】
  17. 游戏引擎编程需要哪些基本数学知识?
  18. Kotlin学习笔记(二)——函数操作符内置函数
  19. 一句话证明你在阿里待过!(这才是最真实的阿里)
  20. 一个登录页面的测试用例(借鉴他人的,方便查阅)

热门文章

  1. 链表之判断一个链表是否为回文结构(二)
  2. linux block设备,Linux I/O Block--块设备的表示
  3. mysql profiles清空_MYSQL 使用show profiles 分析性能
  4. 各种震撼的慢镜头,奇怪的知识又增加了!​
  5. AI浪潮席卷而来,现在加入还来得及吗?
  6. java跨平台的特性_【简答题】什么是跨平台特性?Java怎样实现跨平台特性?
  7. linux访问nfs端口号,linux nfs配置及访问控制
  8. eval() php,js-eval编码,js-eval解码
  9. 计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案
  10. 开发板实现645协议C语言,迅为-imx6ull开发板之C语言实现LED例程