`
风雪涟漪
  • 浏览: 507229 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9013
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18412
社区版块
存档分类
最新评论

Schema的优化和索引 - 选择最佳的数据类型 - 字符串类型

阅读更多

字符串类型

MySQL支持很多字符串类型,以及它们的许多变化类型。这些数据类型在4.1和5.0版本变化都比较大。可以说变得更复杂了。早在4.1版本中,每个字符串列都有自己的字符集和对于那些字符集的排序规则,或者叫做collation(校对)。

 

VARCHAR和CHAR

有两个主要的字符串类型就是VARCHAR和CHAR。它们都存储了字符值。不幸的是,很难准确解释这些值怎样存储在硬盘和内存中,因为这些都是有存储引擎实现的。我们假设你使用的是MyISAM和/或者InnoDB.如果不是,你最好查阅你使用存储引擎的相关文档。

 

让我们先看看VARCHAR和CHAR是怎样存储在硬盘上的。要注意的是存储引擎可能存储的CHAR或者VARCHAR在存入内存和硬盘上有所不同的,以及当服务器从存储引擎获得了这个值的时候,会把这个值转为另一个存储引擎的格式。下面就是两种类型的比较

 

VARCHAR:

 

VARCHAR存储了变长的字符串以及它是最常见的字符串数据类型。它占用的空间要少于定长的类型,因为它根据所需来决定需要的空间大小。特例就是MyISAM参数设为ROW_FORMAT=FIXED.这个参数使表的每一行使用固定大小的空间以及浪费大量的空间。

 

varchar使用了1或者2额外的字节记录值的长度:如果长度大约为255字节的话,大概使用1个字节,如果更多的话,那么就是2个字节。假如是latin1字符节,一个varchar(10)将会占用11字节的存储空间。一个varchar(1000)使用上限为1002字节。因为需要2字节存储长度信息。

 

VARCHAR会对性能有所帮助,因为它节约了空间。然而,因为行是变长,当你更新它们的时候,它们就会增长。这样会导致需要额外的一些工作。如果一行增长以及并不在原来的地址了。这些行为依赖于存储引擎。举个例子,MyISAM可能把行分为碎片。以及InnoDB可能切开页,把行填充到它的内部。其他的存储引擎可能在适当的地方不会更新数据。

 

当最大列长度比平均长度要大的时候就值得使用VARCHAR.当很少更新字段的时候,存储碎片就不是一个问题。以及当你使用复杂的字符集如UTF-8时,每个字符都使用变量的字节数存储。

 

在5.0以及最新的版本,当你存储和获取值的时候,MySQL会保留尾部的空格。在4.1和更早的版本,MySQL去掉尾部空格。

 

CHAR

CHAR是定长的:MySQL总是分配指定的内存空间去存储字符。当存储了一个CHAR值,MySQL去掉尾部空格。值附加了空格是比较的需要。

 

如果你存储的字符串是非常短的,用CHAR是非常有用的。举个例子,存储密码的MD5值使用CHAR是个好的选择。因为这个MD5一直是定长的。如果数据经常修改的话CHAR要优于VARCHAR。因为定长的行并不会有存储残片。对于非常短的列,CHAR要比VARCHAR高效。一个CHAR(1)用来存储Y和N值。这只会使用1个字节,但是一个VARCHAR(1)会使用两个字节。有个字节用来保存它的长度信息。

 

 

这个行为让人有点困惑,因此我们举一个例子。首先,我们创建一个有单独CHAR(10)列的表以及存储一些数值。

 

 

mysql> CREATE TABLE char_test( char_col CHAR(10));

mysql> INSERT INTO char_test(char_col) VALUES

-> ('string1'), (' string2'), ('string3 ');

 

当我们获取这个值的时候,尾部空格被去掉了。

 

 

mysql> SELECT CONCAT("'", char_col, "'") FROM char_test;

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

| CONCAT("'", char_col, "'") |

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

| 'string1' |

| ' string2' |

| 'string3' |

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

 

如果我们保存相同的值到VARCHAR(10)的列。结果如下

 

mysql> SELECT CONCAT("'", varchar_col, "'") FROM varchar_test;

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

| CONCAT("'", varchar_col, "'") |

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

| 'string1' |

| ' string2' |

| 'string3 ' |

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

 

数据的存储方式取决于存储引擎。每个存储引擎处理定长和变长并不是使用相同的方法。内存存储引擎使用的定长的行。因此它为每个值分配尽可能大的空间。即使这个字段是变长的也是如此。然而,附加和去除空格的行为时跨越存储引擎的。因为这是由MySQL自身来操作的。

 

CHAR和VARCHAR的兄弟类型是BINARY和VARBINARY.它们存储了二进制字符串。二进制字符串和传统字符串非常相似。但是他们存储字节而不是字符。附加也是不同的:MySQL给 BINARY值附加了\0而取代了空格。获取数据的时候也不会去掉它。

 

当你需要存储二进制数据以及希望MySQL把值作为字节去比较而不是字符的时候,这些类型是比较有用的。比较字符宽度的优势不仅仅是不区分大小写。MySQL逐个的比较二进制字符串的一个字节。比较依据就是每个字节的数值。作为结果来说,二进制比较 比 字符比较 简单的多。因此它们的速度更快。

 

 

BLOB和TEXT

BLOB和TEXT是为了分别存储超大的二进制数据和字符串。事实上,它们还有一些其他的属于同一种类的数据类型,如TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,以及LONGTEXT,以及二进制类型是TINYBOLB,SMALLBLOB,BLOB,MEDIUMBLOB和LONGBLOB.要注意的是BLOB就是SMALLBLOB,TEXT是SMALLTEXT.

 

不像其他的数据类型,MySQL用自身标识把每个BLOB和TEXT作为一个对象来处理。存储引擎专门的存储它们。当它们太大的时候,InnoDB会使用一个独立外部的存储区域来保存它们。一行中的每个值都需要1-4个字节的存储空间以及真正保存它们的地方实际上是外部的存储空间。

 

这两个类型唯一的区别就是,BLOB保存的二进制数据并没有校对规则或字符集,而TEXT保存的是字符串并有一个校对规则和字符集。

 

MySQL对BLOB和TEXT排序和其他类型有所不同:并不是对全长的String进行排序,而是根据列的max_sort_length字节来排序。如果你需要前几个字符进行排序。你可以降低max_sort_length 变量或者使用ORDER BY SUBSTRING(Column,length)

 

2
0
分享到:
评论

相关推荐

    MySQL优化面面观----优化查询效率.pdf

    将int、date等非字符串类型的数据转换为字符串存储虽然可行,但不推荐,因为不同数据类型有各自的校验规则,字符串类型的处理通常更为复杂,可能影响查询效率。 实验数据显示,两张存储数据一致的表emp2和emp3,但...

    Mysql优化选择最佳索引的方法共2页.pdf.zip

    8. **使用合适的数据类型**:选择合适的数据类型不仅可以节省存储空间,还可以提高索引效率。例如,使用INT代替VARCHAR,整数类型的比较通常比字符串快。 9. **避免冗余和重复索引**:确保每个列只有一个索引,避免...

    9.Schema与数据类型优化1

    总的来说,Schema和数据类型优化是数据库设计的基础,通过合理的规划和选择,可以有效提升数据库的性能,减少资源消耗,确保系统的高效运行。同时,理解并运用这些知识,也能帮助你在遇到性能问题时,找到合适的解决...

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    查询优化器分析和选择执行查询的最佳路径,以最大化性能,它是数据库管理系统的关键组件。 数据库连接池的配置和使用涉及设置最大和最小连接数、超时时间、验证策略等,例如在Java中,可以通过JDBC的DataSource接口...

    JSON入门Java篇-2-JSON数据类型.rar

    JSON支持五种基本数据类型:字符串(String)、数字(Number)、布尔值(Boolean)、数组(Array)和对象(Object)。 - 字符串:用双引号包围,支持Unicode字符,例如:"example"。 - 数字:可以是整数或浮点数...

    详解MySQL中的数据类型和schema优化

    MySQL数据库在设计和优化时,数据类型的选择与schema的规划起着至关重要的作用。数据类型不仅影响存储空间,还直接影响查询速度和系统性能。本文主要探讨了如何在MySQL中选择合适的数据类型以及优化schema。 首先,...

    Laravel开发-laravel-schema

    例如,`$table->create()`后可以跟一系列的列定义,如`$table->string('name')`定义字符串类型的列。 - `table`:用于对已存在的表进行修改,如添加、删除或更改列。 - `increments`:创建一个自增的主键列,通常...

    一个简单的schema讲解小例子(源码)

    5. **数据类型**:Schema支持多种内置数据类型,如字符串、整数、日期等,也可以自定义数据类型,确保数据的一致性。 6. **国际化支持**:Schema支持多语言,使得XML文档能够适应全球化的应用场景。 7. **命名空间...

    DWRESCR DWH SCHEMA帮助文档

    7. **数据类型(Data Types)**:数据类型定义了字段可以存储的数据种类,如整数、字符串、日期时间等。选择合适的数据类型可以确保数据的有效性和存储效率。 8. **约束(Constraints)**:约束是定义表中数据规则...

    MySQL性能优化详解.docx

    例如,尽量使用数值类型而不是字符串类型来存储数字,尽可能使用更小的整型(如`MEDIUMINT`而非`INT`),以及定义列时尽量避免使用`NULL`值等。 - **索引**: 合理使用索引可以极大地提高查询速度,但过度或不恰当地...

    MySQL优化文档笔记

    MySQL优化是数据库管理中至关重要的任务,涉及到多个层面,包括SQL语句的编写、系统配置、存储引擎选择以及数据类型优化等。以下是对这些关键点的详细解释: 首先,MySQL Server的核心组件包括连接器、分析器、优化...

    mysql分区代码.txt

    - `username`:字符串类型,最大长度2000字符。 - `userage`:字符串类型,最大长度500字符。 - `usersex`:字符串类型,最大长度500字符。 - `userphoto`:字符串类型,最大长度500字符。 - `usermobile`:字符串...

    mysql基础知识和mysql优化整理

    2. 数据类型:MySQL支持多种数据类型,如整数类型(TINYINT、INT、BIGINT)、浮点类型(FLOAT、DOUBLE)、字符串类型(CHAR、VARCHAR、TEXT)、日期和时间类型(DATE、TIME、DATETIME、TIMESTAMP)等。 3. SQL语言...

    schema学习资料

    XML Schema定义了XML文档的结构和数据类型,使得XML文件的解析和验证更加规范。 1. **XML Schema定义**:XSD(XML Schema Definition)文件定义了XML文档的元素、属性、数据类型以及它们的规则。 2. **数据类型**:...

    高效MySQL查询加速指南:索引策略、查询优化、性能调优,助力数据库管理员和开发者突破性能瓶颈

    - **前缀索引的应用**:对于字符串类型的列,可以使用前缀索引来提高索引效率,同时节省存储空间。 #### 四、查询缓存 1. **利用 MySQL 的查询缓存**: - **查询缓存的工作原理**:对于相同的查询,MySQL会从...

    solr schema solrconfig 配置文件解析

    - **字段类型(Field Types)**: 定义了字段的数据类型,如字符串、整型、浮点型等,以及对应的分析器。例如,`text_general`类型的字段通常用于全文检索。 - **字段(Fields)**: 指定文档中的属性,如`title`、`...

    【面试资料】-(机构内训资料)mysql面试题.zip

    - 字符串类型:VARCHAR, CHAR, TEXT。 - 日期和时间类型:DATE, TIME, DATETIME, TIMESTAMP。 4. **数据库设计**: - 正确使用范式理论(1NF, 2NF, 3NF, BCNF)以减少数据冗余。 - 外键和引用完整性:确保数据...

    NCodeGenerate-MySqlSchema

    2. 数据库元数据获取:连接成功后,插件会执行SQL语句,如`SHOW TABLES`,`DESCRIBE table_name`等,获取表的列名、数据类型、主键、外键等信息。 3. 代码模板应用:NCodeGenerate支持自定义模板,用户可以预定义C#...

Global site tag (gtag.js) - Google Analytics