高性能MySQL:字符串类型(1)

作者&投稿:甄哲 (若有异议请与网页底部的电邮联系)
~

   字符串类型( )

  MySQL 支持多种字符串类型 每种类型还有很多变种 这些数据类型在 和 版本发生了很大的变化 使得情况更加复杂 从MySQL 开始 每个字符串列可以定义自己的字符集和排序规则 或者说校对规则(collation)(更多关于这个主题的信息请参考第 章) 这些东西会很大程度上影响性能

   VARCHAR 和CHAR 类型

  VARCHAR 和CHAR 是两种最主要的字符串类型 不幸的是 很难精确地解释这些值是怎么存储在磁盘和内存中的 因为这跟存储引擎的具体实现有关 下面的描述假设使用的存储引擎是InnoDB 和/ 或者MyISAM 如果使用的不是这两种存储引擎 请参考所使用的存储引擎的文档

  先看看VARCHAR 和CHAR 值通常在磁盘上怎么存储 请注意 存储引擎存储CHAR 或者VARCHAR 值的方式在内存中和在磁盘上可能不一样 所以MySQL 服务器从存储引擎读出的值可能需要转换为另一种存储格式 下面是关于两种类型的一些比较

   VARCHAR

  VARCHAR 类型用于存储可变长字符串 是最常见的字符串数据类型 它比定长类型更节省空间 因为它仅使用必要的空间(例如 越短的字符串使用越少的空间) 有一种情况例外 如果MySQL 表使用ROW_FORMAT=FIXED 创建的话 每一行都会使用定长存储 这会很浪费空间

  VARCHAR 需要使用 或 个额外字节记录字符串的长度 如果列的最大长度小于或等于 字节 则只使用 个字节表示 否则使用 个字节 假设采用latin 字符集 一个VARCHAR( ) 的列需要 个字节的存储空间 VARCHAR( ) 的列则需要 个字节 因为需要 个字节存储长度信息

  VARCHAR 节省了存储空间 所以对性能也有帮助 但是 由于行是变长的 在UPDATE 时可能使行变得比原来更长 这就导致需要做额外的工作 如果一个行占用的空间增长 并且在页内没有更多的空间可以存储 在这种情况下 不同的存储引擎的处理方式是不一样的 例如 MyISAM 会将行拆成不同的片段存储 InnoDB则需要分裂页来使行可以放进页内 其他一些存储引擎也许从不在原数据位置更新数据

  下面这些情况下使用VARCHAR 是合适的 字符串列的最大长度比平均长度大很多 列的更新很少 所以碎片不是问题 使用了像UTF 这样复杂的字符集 每个字符都使用不同的字节数进行存储

  在 或者更高版本 MySQL 在存储和检索时会保留末尾空格 但在 或更老的版本 MySQL 会剔除末尾空格

  InnoDB 则更灵活 它可以把过长的VARCHAR 存储为BLOB 我们稍后讨论这个问题

   CHAR

  CHAR 类型是定长的 MySQL 总是根据定义的字符串长度分配足够的空间 当存储CHAR 值时 MySQL 会删除所有的末尾空格(在MySQL 和更老版本中VARCHAR也是这样实现的 也就是说这些版本中CHAR 和VARCHAR 在逻辑上是一样的 区别只是在存储格式上) CHAR 值会根据需要采用空格进行填充以方便比较

  CHAR 适合存储很短的字符串 或者所有值都接近同一个长度 例如 CHAR 非常适合存储密码的MD 值 因为这是一个定长的值 对于经常变更的数据 CHAR 也比VARCHAR 更好 因为定长的CHAR 类型不容易产生碎片 对于非常短的列 CHAR 比VARCHAR 在存储空间上也更有效率 例如用CHAR( ) 来存储只有Y 和N 的值 如果采用单字节字符集注 只需要一个字节 但是VARCHAR( ) 却需要两个字节 因为还有一个记录长度的额外字节

  CHAR 类型的这些行为可能有一点难以理解 下面通过一个具体的例子来说明 首先 我们创建一张只有一个CHAR( ) 字段的表并且往里面插入一些值

  当检索这些值的时候 会发现string 末尾的空格被截断了

  如果用VARCHAR( ) 字段存储相同的值 可以得到如下结果

  数据如何存储取决于存储引擎 并非所有的存储引擎都会按照相同的方式处理定长和变长的字符串 Memory 引擎只支持定长的行 即使有变长字段也会根据最大长度分配最大空间 不过 填充和截取空格的行为在不同存储引擎都是一样的 因为这是在MySQL 服务器层进行处理的

       返回目录 高性能MySQL

       编辑推荐

       ASP NET MVC 框架揭秘

       Oracle索引技术

       ASP NET开发培训视频教程

lishixinzhi/Article/program/MySQL/201311/29687




Mysql数据库优化可以从哪几个方面优化
1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。2、使用连接(JOIN)来代替子查询(Sub-Queries)MySQL从4.1开始支持SQL的子查询。这个...

mysql 数据库varchar可以存储多少个汉字和多少个数字?
4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节) 5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个 其实最好的办法是在自己数据库中建个表试试可以放多少汉字,现在mysql都5.0已上了,...

mysql和sqlserver的区别
2. 性能:MySQL在性能方面表现出色,这得益于其默认的MyISAM存储引擎。MyISAM数据库与磁盘的兼容性良好,且对CPU和内存的占用较低。MySQL可以在Windows系统上运行而不会产生冲突,在UNIX或类UNIX系统上表现更佳。使用64位处理器还能进一步提升性能,因为MySQL在内部经常使用64位整数处理。例如,Yahoo的商业...

MySQL与sqlserver区别
3. 性能:MySQL以其MyISAM引擎提供出色的性能,尤其适合需要高效率数据访问的应用。它能在Windows和UNIX系统上良好运行,并利用64位处理器提升性能。SQL Server则以其稳定性和复杂操作处理而著称,尽管这可能需要更高的硬件和软件支持。4. 安全功能:两者都具备完善的安全机制。MySQL的二进制日志支持数据的...

mysql表字段多了,对性能影响有多大
一般来说,字段多会慢。字段多,会让表结构庞大,索引起来很慢。不妨多键一些表,处理好表之间的关系就好,会很清晰的。

php+mysql优化,百万至千万级快速分页mysql性能到底能有多高
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始。有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,...

mysql的innodb数据库引擎详解
除此之外innodb引擎还提供了插入缓存(insert buffer)、二次写(double write)、自适应哈西索引(adaptive hash index)、预读(read ahead)等高性能技术。1.3.2、myisam存储引擎,myisam特点是不支持事物,适合olap应用,myisam表由MYD和MYI组成。mysql-5.0版本之前,myisam默认支持的表大小为4G,从mysql-5.0以后,myisam...

SQLServer与MySQL性能相差多大
由于其诞生早、结构严谨、高可用、高性能等特点,使其在传统数据库应用中大杀四方,金融、通信、能源、运输、零售、制造等各个行业的大型公司基本都是用了Oracle,早些年的时候,世界500强几乎100%都是Oracle的用户。MySQL:MySQL的最初的核心思想,主要是开源、简便易用。其开发可追溯至1985年,而第一个...

mysql全文搜索索引的字段提高搜索效率
一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),...

如何使用MySQL自带的性能压力测试工具mysqlslap
mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456 mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456 mysqlslap -a -e innodb -uroot -p123456 mysqlslap -a --number-of-queries=10 -uroot -p123456 测试同时不同的存储引擎的性能进行...

册亨县17852234666: MySQL有什么推荐的学习书籍 -
牛股安迪: 1、深入浅出mysql 2、高性能mysql 此外,简单介绍下两本书的特点和不同 1、从书的内容做比较 《深入浅出MySQL》从数据库的基础、开发、优化、管理维护4个方面对MySQL进行了详细的介绍,其中每一部分都独立成篇. 基础篇主要适合于...

册亨县17852234666: MYSQL中如何选择合适的数据类型 -
牛股安迪: 1.选择数据类型的基本原则 前提: 使用适合存储引擎. MyISAM数据表,最好使用固定长度的数据列代替可变长度的数据列. 2). MEMORY存储引擎和数据列 MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或...

册亨县17852234666: MYSQL表字段type内容形如'1,2,3,4',何高速的从100万条记录中查询包含如'2或4'或其他 -
牛股安迪: 参考一下 MYSQL 的枚举类型 和set 类型... MySql中的ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值. 可以插入空字符串""和NULL: 如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插...

册亨县17852234666: MYSQL数据库设计数据类型选择需要注意哪些地方 -
牛股安迪: •VARCHAR和CHAR类型,varchar是变长的,需要额外的1-2个字节存储,能节约空间,可能会对性能有帮助.但由于是变长,可能发生碎片,如更新数据; •使用ENUM代替字符串类型,数据实际存储为整型. •字符串类型 •要尽可能地避...

册亨县17852234666: sql 中怎样将string类型的“1”转换成int类型的“1”用于加减法? -
牛股安迪: 数据库中的字符型数据值是用单引号引起来的,如果不用单引号引起来的数字就会被认为是数字型,举个sqlserver 的例子,比如:1 2select'1'+'1';--这个会输出的是11 select1+1;--这样的话输出的就是2 如果是字符型转换数字型的话也可以,就要函数处理,比如: 1selectconvert(int,'1')+convert(int,'1');--这样输出的话就是2,因为函数将字符型已经转成了int型

册亨县17852234666: mysql最好的优化技巧 -
牛股安迪: 展开全部1、选取最适用的字段属性 MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例...

册亨县17852234666: mysql数据库存储行政代码用什么类型 -
牛股安迪: html那个pasword为*是可以输出来的,如果要在mysql里面存储密码,可以考虑用字符串类型 char(32) 32位,然后将前台html里面输入的密码用MD5多加密几次(加密一次很容易破解)然后将加密后的密码(32位)插入到数据库中.如果以后要实现登陆验证功能,可以把用户登陆的密码MD5后再跟数据库比较..

册亨县17852234666: PHP MYSql 数值类型(int)与字串类型(char)区别!~ -
牛股安迪: 两个就是存的数据的大小不同,int 1位代表两字节,char 1位代表一字节 还有的就是int 存的是我们的数字123,char 存的是我们的中文,英文,

册亨县17852234666: mysql索引什么意思 -
牛股安迪: MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响.通常来说,可以遵循以下一些指导原则:(1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快.(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂.在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址.(3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL.在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂.你应该用0、一个特殊的值或者一个空串代替空值.

册亨县17852234666: 怎么样把mysql 字符串类型转为整数类型 -
牛股安迪: 1、convert(目标数据类型,原数据) 2、cast(原数据 as 类型)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网