mysql tinyint和char(1)性能对比

2023-11-03

在数据库设计的时候会遇到很多只需要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还是使用短小的整型更好.

转载自:http://blog.51cto.com/xiaozhong991/1892569

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql tinyint和char(1)性能对比 的相关文章

随机推荐

  • Eclipse优化,关闭不必要的验证,简单粗暴!

    路径 Window gt Preferences gt Validation 如下图所示 只需勾选这几项即可
  • 半夜睡不着,MFC搞起来!

    一 MFC的概念和作用 1 什么是MFC 全称 Microsoft Foundation Class Library 我们称之为微软基础类库 封装了各种windowsAPI函数 C 语法 中的一些数据结构 1 MFC就是一个类库 2 MFC
  • Android Calendar的运用

    pre class java package com iwode common import java text DateFormat import java text ParsePosition import java text Simp
  • 毕业设计---用算法实现OCR文字识别(基于java实现的文字识别技术)

    文末附源码 识别效果如下图 由于是自己实现算法所以识别率不算太高 但是这个相比较一般的模型 识别这么多还是可以的 如果需要做的只是识别率比较高 不关注谁去实现的算法 可以采用第三方的API 百度智能云就很不错 使用方式和前面的百度AI实现人
  • 数据分析:利用gpt进行归因分析

    prompt 你是某电商平台的一名数据分析师 发现昨日的GMV环比下降了5 请对这数据变动做出归因 output 在电商行业中 GMV 总销售额 是一个非常重要的指标 用于衡量业务的整体健康状况 当GMV出现环比下降时 这通常意味着需要进行
  • ThinkPHP中模型的创建和实例化操作

    https blog csdn net qq 41630218 article details 80920289 https www cnblogs com 457248499 qq com p 7388270 html
  • webpack模块分写导出与导入配置 -9

    1 确保自己的电脑已经安装了node和Git软件 2 自己在盘里随便创建一个文件夹一般为英文 也就是你自己的项目名称 3 在新创建好的文件夹里面右键点击调出git指令窗口在窗口里面输入如下指令 1 npm install webpack g
  • Electron 判断互联网网络连接

    项目场景 Electron 实现桌面程序 问题描述 尝试使用原生的 EventTarget addEventListener 监听 window online 和 window offline 事件 但是在调用函数并手动断网之后 却发现并没
  • Acwing 5. 多重背包问题 II

    本题朴素做法与完全背包类似 那么优化解法是不是也可以借鉴完全背包那样呢 答案是否定的 因为完全背包中的物品有无限个 而多重背包中的物品是有限个 两个公式不能进行合并 有点级数的意思 也就是说 max函数不能通过总体的最大值减去最后一项的最大
  • Tomcat的安装与配置

    Tomcat的安装与配置 一 准备与安装 1 在下载安装tomcat之前请确保计算机上已有java环境 可以通过键盘Windows R 输入cmd 输入java version来确定JDK版本 我使用的是JDK1 8 2 进入Tomcat官
  • 众享比特未来融合研究院执行院长王陈慧子博士以第一作者在IEEE TCSS上发表论文

    近日 众享比特未来融合研究院执行院长王陈慧子博士为第一作者 通讯作者的学术论文 Toward Understanding Attention Economy in Metaverse A Case Study of NFT Value 探究
  • nvidia-smi 无进程占用GPU,但GPU显存却被占用了很多

    下图是我当时遇到的问题 如上图 GPU1 显示占用了10G多的显存 但是却没有相应的进程 此时可使用如下命令查看进程 fuser v dev nvidia 显示如下图 此时把这些进程全部 kill 掉 kill 9 5142 5143 51
  • win10误删的注册表能还原吗_win10注册表删错了怎么办_win10注册表删错东西如何恢复-win7之家...

    我们要知道 注册表是Microsoft Windows中的一个重要的数据库 用于存储系统和应用程序的设置信息 在win10系统中 用户可以通过修改注册表来保证电脑的安全 可是近日有的用户在修改注册表时不小心删错了 那么win10注册表删错了
  • 分页居中显示

    div class page number div div div page number width 100 height 80px padding top 10px text align center page number1 disp
  • 如何阅读芯片手册

    原视频链接 如何快速阅读芯片数据手册 初学者和外行进 1 芯片手册的结构 1 Features 特性 对芯片的特点进行了总结 2 General Description 概述 把芯片的功能进行了一个大概的总结 这部分对新手来说很重要 每一个
  • SDIO接口(4)——SDIO通信

    SDIO通信 SD总线上的通信基于命令和数据位流 这些命令和数据位流由起始位启动 并由停止位终止 SDIO总线上的设置和控制都是通过命令来实现 SDIO总线上都是HOST端发起请求 然后DEVICE端回应请求 其中请求和应答中会包含数据信息
  • 香橙派4和树莓派4B构建K8S集群实践之八: TiDB

    目录 1 说明 2 准备工作 3 安装 3 1 参考Tidb官方 v1 5安装说明 3 2 准备存储类 3 3 创建crd 3 4 执行operator 3 5 创建cluster dashboard monitor容器组 3 6 设置访问
  • Android BottomNavigationView的使用

    BottomNavigationView大于3个menu文字和icon都显示 代码中设置 public static void disableShiftMode BottomNavigationView view int count vie
  • 使用Java对轨迹进行抽稀,并生成mvt(Map Vector Tile)瓦片

    Java对轨迹进行抽稀 并生成mvt线瓦片 1 原理 2 pom依赖 3 Java对轨迹道格拉斯普克抽稀源码 4 Java生成线瓦片源码 参考 1 原理 Java对轨迹抽稀 道格拉斯普克算法 生成mvt瓦片 VectorTileEncode
  • mysql tinyint和char(1)性能对比

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