`
hongtoushizi
  • 浏览: 378872 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

MySQL Innodb数据库性能实践——VARCHAR vs CHAR

阅读更多

学过数据库理论的读者,都应该还记得关于CHAR和VARCHAR的性能对比:CHAR比VARCHAR更快,因为CHAR是固定长度的,而VARCHAR需要增加一个长度标识,处理时需要多一次运算。

 

针对这种情况,我做了一下基准测试,基准测试环境如下:
【硬件配置】

 

硬件

配置

CPU

Intel(R) Xeon(R) CPU E5620 主频2.40GHz, 物理CPU 2个,逻辑CPU 16个

内存

24G(6块 * 4G  DDR3 1333 REG)

硬盘

300G * 3个,SAS硬盘 15000转,无RAID,有RAID卡,且开了回写功能

OS

RHEL5

MySQL

5.1.49/5.1.54

 

【MySQL配置】

 

配置项

配置

innodb_buffer_pool_size

18G

innodb_log_file_size 

200M

innodb_log_files_in_group 

3

sync_binlog

100

innodb_flush_log_at_trx_commit

2

 

【表配置】
VARCHAR平均长度200,CHAR长度250,其它配置如下:

 

配置项

配置

记录数

1000万,2000万,5000万,1亿

存储引擎

Innodb

行格式

compact

 

 

 

 

 

性能测试结果如下:

 

【查询】query

 

【插入】 insert  

 

【更新】更新时VARCHAR也是随机长度

 

update

 

【删除】delete

 

测试结果展现了一个与理论不太相符的现象:当表大小小于Innodb buffer pool时,CHAR和VARCHAR没有差别,而在表大小大于Innodb buffer pool时,VARCHAR性能反而更高!这是为什么呢?

 

首先,性能是综合硬件、配置、表记录数、业务模型等多种因素综合后的结果,单一因素的差异,对整体来说可能几乎没有影响
例如,执行一个操作需要100ms,而CHAR 比 VARCHAR性能上只快了1微秒,那么最终的性能就不会有影响。
这就是当Innodb buffer pool足够大时,CHAR 和VARCHAR没有差别的原因。

 

再次,理论上CHAR比VARCHAR快的根本原因是站在CPU的角度来说的,但性能是综合各种因素后的最终结果,当Innodb buffer pool小于表大小时,"磁盘读写"成为了性能的关键因素,而VARCHAR更短,因此性能反而比CHAR高

 

最后,有朋友可能会认为,VARCHAR更新时如果新的数据比旧的数据要长,可能需要移动数据,导致性能更低;从实测结果来看,这种操作对最终的性能也是没有明显影响的。应该是因为Innodb采用页管理数据,数据移动是先在内存里完成,再写到磁盘,因此数据即使移动也很快。

【应用技巧】
基于以上测试结果和分析,我个人认为一般情况下优先使用VARCHAR,特别是字符串的平均长度比最大长度要小很多的情况
当然,如果你的字符串本来就很短,例如只有10个字符,那么就优先选CHAR了

 

转载自: http://tech.uc.cn/?p=1910

分享到:
评论

相关推荐

    MySQL 数据库设计实践

    ### MySQL 数据库设计实践 #### 一、MySQL介绍 MySQL是一种关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。它以其高性能、高可靠性和易用性而受到广泛欢迎,尤其适合Web应用程序。 - **连接...

    InnoDB性能调节提示

    MySQL的InnoDB存储引擎在处理大量数据和高并发事务时,其性能调优至关重要。以下是一些关于如何配置和优化InnoDB性能的关键提示: 1. **监控InnoDB状态**: 使用`SHOW INNODB STATUS`命令可以查看InnoDB引擎的状态...

    MySQL中VARCHAR与CHAR格式数据的区别

    在MySQL数据库中,CHAR和VARCHAR是两种常见的字符串数据类型,它们在存储和处理方式上有着显著的区别,这对于数据库设计和性能优化至关重要。 首先,CHAR是一种固定长度的数据类型。这意味着无论你存储的实际数据有...

    MySQL——数据库表.rar

    MySQL支持多种数据类型,包括整数类型(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT)、浮点数类型(FLOAT、DOUBLE)、字符串类型(CHAR、VARCHAR、TEXT)、日期和时间类型(DATE、TIME、DATETIME、TIMESTAMP)以及...

    试析MySQL数据库性能的调优.pdf

    MySQL数据库性能调优是一项关键任务,特别是在大数据量和高并发环境下,性能优化显得尤为重要。本文由王晓华针对MySQL数据库性能调优进行了深入分析,主要探讨了数据类型的选择和存储引擎的影响,并给出了实际操作...

    MySQL数据库的性能优化.pdf

    MySQL数据库的性能优化是数据库管理中的重要议题,其目的是通过一系列策略和技术提升数据库的响应速度和处理能力。本文主要从8个方面详细介绍了优化MySQL性能的方法。 首先,选取最适用的字段属性至关重要。在设计...

    MySQL数据库char与varchar的区别分析及使用建议

    MySQL数据库中的`CHAR`和`VARCHAR`是两种常见的字符型数据类型,它们在存储和处理方式上有显著区别,对数据库性能和存储空间有着直接影响。理解它们的差异对于优化数据库设计至关重要。 `CHAR`数据类型是固定长度的...

    数据库+Mysql+性能调用+用于在实践过程中进行Mysql的性能调优

    以上实践旨在帮助开发者在实际开发过程中避免性能陷阱,提高MySQL数据库的运行效率。在使用时,需结合MySQL的实际运行环境和业务需求,灵活应用这些技巧。同时,深入理解MySQL的工作原理和索引机制,是提高优化效果...

    完全优化MySQL数据库性能的八大巧方法

    ### 完全优化MySQL数据库性能的八大巧方法 在当今数据驱动的世界中,数据库的性能优化对于确保应用程序的高效运行至关重要。MySQL作为一种广泛使用的开源关系型数据库系统,其性能优化一直是开发者关注的重点。本文...

    mysql常用数据库命令

    根据提供的标题、描述以及部分内容,我们可以总结出一系列MySQL数据库中的常用命令及操作。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),因其高效性、可靠性和灵活性而在多种应用场景中受到青睐。下面将...

    mysql MySQL数据库开发优化与管理维护

    ### MySQL数据库开发优化与管理维护 #### 概览 ...通过以上内容的学习,读者可以全面了解MySQL数据库的开发过程、性能优化技巧以及日常管理维护方法,从而更好地利用MySQL数据库为业务提供支持。

    MySQL数据库设计、优化.pptx

    MySQL数据库设计与优化是数据库管理中的重要环节,它关乎到系统的性能、稳定性和可扩展性。本讲座由叶金荣分享,主要涵盖了多个关键方面,包括规范、基础规范、命名规范、库表规范、字段规范、索引规范以及开发环境...

    优化MySQL数据库性能的八大“妙手”

    MySQL数据库的性能优化是数据库管理的关键环节,尤其在大数据量的场景下,高效的数据库操作能够显著提升系统的响应速度和整体性能。以下是从标题和描述中提取的八大优化策略的详细说明: 1. **选择合适的字段属性**...

    MySQL数据库设计、优化

    MySQL作为一种广泛使用的开源关系型数据库管理系统,其设计的好坏直接影响着系统的性能、稳定性和可维护性。因此,合理的数据库设计对于确保应用程序能够高效运行至关重要。 #### 二、数据库设计规范 ##### 基础...

    MySQL进阶面试题,数据库三范式、数据库优化、索引有哪些种类、索引的工作机制、MySQL 的基础操作

    9.mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵 义?10.MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区 别?11.表中有大字段 X(例如:text 类型),且字段 X 不会经常更新,...

    Mysql数据库面试题1

    MySQL数据库在面试中常常涉及许多核心概念和技术,包括数据类型的选择、存储引擎的差异、SQL优化策略以及数据库的基本操作。以下是对这些知识点的详细解释: 1. **VARCHAR与CHAR的区别**: - VARCHAR是一种可变...

    MySQL数据库技术实验报告模板.pdf

    在设计数据库时,需要了解 MySQL 的基本数据类型,包括 char、varchar、int、float 等。此外,还需要了解空值的概念,包括 NULL、NOT NULL 等。 四、 表结构设计 在设计表结构时,需要了解字段类型、字段长度、...

    MySQL 数据库经典面试题解析.zip

    接着,我们需要熟悉MySQL的数据类型,包括数值类型(如INT、FLOAT、DECIMAL)、字符串类型(VARCHAR、CHAR)、日期时间类型(DATE、TIME、DATETIME、TIMESTAMP)以及二进制类型(BLOB、TEXT)。理解这些数据类型及其...

Global site tag (gtag.js) - Google Analytics