在数据库设计的时候会遇到很多只需要0、1、2这种固定几个值的状态字段,基本上都建议设置为只占一字节的tinyint类型,有些觉得char(1)是一样,毕竟char(1)存储数字和字母时一个字符也只是占一个字节

mysql是用c++写的,而在c++中字符类型是存放对应ascii码的二进制到存储空间,而整型数字是直接存数字的二进制,虽然最终都是二进制存储,但是环节上有少许不同,同样在msyql查找时也会有所不同,下图摘自小白版c++教程《c++ primer plus》:

今天对tinyint和char(1)做了个简单测试,分表建两个表t1、t2,结构如下:

mysql> show create table t1\G

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

Table: t1

Create Table: CREATE TABLE `t1` (

`_id` int(11) NOT NULL AUTO_INCREMENT,

`id` tinyint(4) DEFAULT NULL,

`title` text,

PRIMARY KEY (`_id`),

KEY `id` (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2400096 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

mysql> show create table t2\G

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

Table: t2

Create Table: CREATE TABLE `t2` (

`_id` int(11) NOT NULL AUTO_INCREMENT,

`id` char(1) DEFAULT NULL,

`title` text,

PRIMARY KEY (`_id`),

KEY `id` (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2400096 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

两个表唯一不同为id字段类型,总数据量都为2400096,id只有0、1、2三个,为了两个表的数据一样且磁盘上分布也一样,降低IO对测试的影响,分别加载的数据如下:

mysql> select id,count(*) from t1 group by id;

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

| id   | count(*) |

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

|    0 |  1199998 |

|    1 |  1199998 |

|    2 |       99 |

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

3 rows in set (0.55 sec)

mysql> select id,count(*) from t2 group by id;

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

| id   | count(*) |

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

| 0    |  1199998 |

| 1    |  1199998 |

| 2    |       99 |

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

3 rows in set (0.77 sec)

查看执行计划:

mysql> explain select _id from test.t2 where id='1';

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

| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows    | Extra                    |

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

|  1 | SIMPLE      | t2    | ref  | id            | id   | 4       | const | 1170900 | Using where; Using index |

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

1 row in set (0.00 sec)

mysql> explain select _id from test.t1 where id=1;

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

| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows    | Extra       |

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

|  1 | SIMPLE      | t1    | ref  | id            | id   | 2       | const | 1170601 | Using index |

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

1 row in set (0.00 sec)

两个表都使用了id索引,再看看information_schema.tables的信息是否和之前理解的存储字节大小是否有出入:

mysql> select DATA_LENGTH/1024/1024,INDEX_LENGTH/1024/1024,data_free from tables where table_name in ('t1','t2');

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

| DATA_LENGTH/1024/1024 | INDEX_LENGTH/1024/1024 | data_free |

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

|          310.81250000 |            27.56250000 |         0 |

|          313.81250000 |            29.56250000 |         0 |

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

2 rows in set (0.00 sec)

两个表大小相差不多,确认char(1)和tinyint占字节数相同,现在直接看执行时间:

mysql> show profiles;

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

| Query_ID | Duration   | Query                                                         |

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

|        1 | 0.60804275 | select count(*) from (select _id from test.t1 where id=1) a   |

|        2 | 0.59277575 | select count(*) from (select _id from test.t1 where id=1) a   |

|        3 | 0.60398000 | select count(*) from (select _id from test.t1 where id=1) a   |

|        4 | 0.69068025 | select count(*) from (select _id from test.t2 where id='1') a |

|        5 | 0.69654200 | select count(*) from (select _id from test.t2 where id='1') a |

|        6 | 0.67788800 | select count(*) from (select _id from test.t2 where id='1') a |

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

这样就很明显可以看出为char(1)字段的t2表查询时消耗时间偏多,如果几条几百条的情况根本看不出char(1)和tinyint的差别,毕竟现在CPU的效率是非常高的,这里测试的利用了id=1的数据,有1199998条,这样就可以看出点差别了!!虽然效率差别不是很大,为了生产环境统一以及提升QPS还是使用短小的整型更好

转载于:https://blog.51cto.com/xiaozhong991/1892569

mysql tinyint和char(1)性能对比相关推荐

  1. mysql tinyint 与char_mysql tinyint和char(1)性能对比

    mysql tinyint和char(1)性能对比 在数据库设计的时候会遇到很多只需要0.1.2这种固定几个值的状态字段,基本上都建议设置为只占一字节的tinyint类型,有些觉得char(1)是一样 ...

  2. mysql查询char和int哪个快_MySQL中int、char以及varchar的性能对比

    本篇文章给大家带来的内容是关于MySQL中int.char以及varchar的性能对比,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 网络上有许多似是而非的"谣言" ...

  3. mysql win linux性能对比,不同系统上 MySQL 的性能对比

    不同系统上 MySQL 的性能对比 发布时间:2006-07-16 16:44:23来源:红联作者:koov 这个文件中包含了不同基准测试的结果. 测试结果后)中的数字表示精确测试中执行的SQL命令的 ...

  4. mongodb、mysql、redis的性能对比

    最近因为工作需要,所以研究了一下mongodb,但是不知道它的真实性能怎么样,所以对比mysql做了一些测试,现在只是插入操作,更新还没来得及弄,贴出来和大家分享一下(已经补齐redis部分) 1.数 ...

  5. MySQL中的char和varcharmysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

    1.varchar能存多少汉字.数字? 具体还是要看版本的,一个字符占用3个字节 ,一个汉字(包括数字)占用3个字节=一个字符 4.0版本以下,varchar(100),指的是100字节,如果存放UT ...

  6. golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比

    阅读使人充实,讨论使人敏捷,写作使人精确. >>> 压测业务场景文章属于互联网社区动态类场景核心功能压测案例.至于题目涉及的MySQL和PostgreSQL之间的关系,主要为业务选型 ...

  7. php vs lua,解析LUA与PHP在WEB应用的性能对比

    解析LUA与PHP在WEB应用的性能对比是本文要介绍的内容,这几天用在WEB开发的LUA框架已经完成,框架中已包括数据库操作和模板操作的功能,能够很简单方便的应用在WEB开发上.在此时我对这个LUA框 ...

  8. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  9. mysql 字符串类型 char varchar

    字符类型用在存储名字.邮箱地址.家庭住址等描述性数据   char指的是定长字符,varchar指的是变长字符 #官网:https://dev.mysql.com/doc/refman/5.7/en/ ...

最新文章

  1. python的基本语句_Python的基本语句
  2. antimalware service executable占用内存过高_Win10系统svchost.exe进程占用内存和网速过高的解决方法...
  3. 初入c++ (八) c++输入和输出
  4. linux网络分析之回环网卡
  5. mnist数据集下载——mnist数据集提供百度网盘下载地址
  6. 《像混球那样思考和行动》
  7. 英特尔的集显和Nvidia的独显切换(切换之后永久有效)
  8. 揭秘终南山隐士:在山中修炼完后还回到红尘中
  9. 云锁和悬镜服务器哪个好,安全狗、悬镜、云锁、云帮手建议用哪个比较好?
  10. oracle中如何查看日志,ORACLE报警日志如何查看
  11. Python爬取煎蛋网多页的图片
  12. 【PR学习笔记】PR学习笔记之PR快捷键
  13. 修改Pycharm for Mac背景色为黑灰配色
  14. 泰安链底层系统设计、核心优势、技术实现
  15. 《CornerNet: Detecting Objects as Paired Keypoints》之 corner pooling 解读
  16. 智慧城市一卡通如何开通
  17. Linux下minicom配置
  18. Max22——导出FBX让windows默认3D查看器可见模型和贴图
  19. 创业力:创业者的9堂必修课01 1 2007IBMJava10100
  20. 【娱乐】末考文综抢救

热门文章

  1. 怎么把动态图从python弄下来_Python将视频或者动态图gif逐帧保存为图片的方法
  2. oracle中怎么导外表,ORACLE 自定义类型该如何导入????
  3. 网关的作用是什么_SpringCloud中Zuul网关原理及其配置,看它就够了
  4. 吴恩达机器学习笔记:(三)梯度下降法
  5. 【每周CV论文】初学深度学习图像超分辨应该要读的文章
  6. 【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?
  7. 如何降低遮挡对人脸识别的影响
  8. 中国湿敏元器件市场研发方向预测与前景趋势研究报告2022版
  9. 全球及中国箱包市场需求前景与投资动态分析报告2022版
  10. 中国碳化硅行业发展走势与需求前景研究报告2022版