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

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

阅读更多

MySQL有很多使用单独的bit去存储数据的类型。不管底层的存储格式以及操作,从技术上来看所有的这些类型都是字符串类型。

 

BIT

在5.0之前的版本,BIT仅仅等同于TINYINT。但是在5.0之后的版本,它已经是个具有一些特性的,和以前完全不同的数据类型了。我们在这讨论的是新增加的特性。

 

你可以使用BIT列存储一个或多个true/false值。BIT(1)定义了一个包含1个bit的字段,BIT(2)存储了2个bits.如此类推。。

BIT最大长度是64bits.

 

不同存储引擎,BIT的特性是不同的。MyISAM为了存储它们把这些列打包为一个整体。因此17个单独的BIT列仅仅要存储17bits(假设每一列都没有NULL值)。MyISAM大约需要3字节存储它们。其他的存储引擎,如Memory和InnoDB。以足够存储这些bits的最小整数类型来存储每一列。因此你就不能节约使用的存储空间了。

 

MySQL把BIT看做字符串类型。并不是数字类型。当你获取一个BIT(1)的值,这个结果是个字符串,但是这字符串是二进制的0或1,要记住并不是ASCII的0或1.然而如果你获取的是数字,这个结果会被转换。如果你要作比较就一定要记住这一点。举个例子,如果你把b'00111001'(这个等同于57)存储到BIT(8)再获取它。你会获得字符串包含了字符码为57.ASCII字符码为9,但是在数字的环境下,你的获得值是57.

 

mysql> CREATE TABLE bittest(a bit(8));

mysql> INSERT INTO bittest VALUES(b'00111001');

mysql> SELECT a, a + 0 FROM bittest;

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

| a | a + 0 |

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

| 9 | 57 |

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

 

这很令人迷惑,所以我们建议要小心的使用BIT类型。对于大部分应用,要尽可能避免使用这个类型。

 

如果你想用一个BIT存储true/false。另一个选择是使用一个可以为NULL的CHAR(0)列。这个列可以存储NULL也可以存储一个空字符串。

 

SET

如果你要存储非常多的true/false。考虑使用SET数据类型把许多列整合为一个。它把一系列的bit打包了。并且十分有效的进行存储。还有就是MySQL有一些如FIND_IN_SET()和FIELD()函数可以很容易使用SET类型。主要的缺点就是需要改变表的定义。需要使用ALTER TABLE,这对比较大的表来说消耗还是很大的。一般来讲,你也不能使用索引来查找SET列。

 

在整数列上进行位运算

对于SET的另一个原则是使用整型。一个例子,你可以把8bits打包一个TINYINT然后用位运算来操作它们。在应用代码中对每一位定义常量可以使这些操作变得更为简单。

 

这种方式最主要的优势是,你可以改变字段中的枚举值,而不必使用ALTER TABLE。缺点就是写出的语句很难理解。一些人很习惯位运算而另一些人确不是。所以是否使用这个技术完全是个人的喜好了。

 

下面的一个例子是关于权限控制的。每个bit或set元素表现的值都是CAN_READ, CAN_WRITE或者CAN_DELETE。如果使用的SET类型,那么MySQL存储的就是bit和值的映射。如果存储的是整形,你就要把映射存储到应用程序代码中了。

下面是SET的例子

mysql> CREATE TABLE acl (
-> perms SET('CAN_READ', 'CAN_WRITE', 'CAN_DELETE') NOT NULL
-> );
mysql> INSERT INTO acl(perms) VALUES ('CAN_READ,CAN_DELETE');
mysql> SELECT perms FROM acl WHERE FIND_IN_SET('CAN_READ', perms);
+---------------------+
| perms |
+---------------------+
| CAN_READ,CAN_DELETE |
+---------------------+

 

如果使用的整形,你可能写出如下的代码

 

mysql> SET @CAN_READ := 1 << 0,
-> @CAN_WRITE := 1 << 1,
-> @CAN_DELETE := 1 << 2;
mysql> CREATE TABLE acl (
-> perms TINYINT UNSIGNED NOT NULL DEFAULT 0
-> );
mysql> INSERT INTO acl(perms) VALUES(@CAN_READ + @CAN_DELETE);
mysql> SELECT perms FROM acl WHERE perms & @CAN_READ;
+-------+
| perms |
+-------+
| 5 |
+-------+

 

我们使用了变量,但是你可以用应用程序中的代码来替换它们。

 

1
1
分享到:
评论

相关推荐

    MySQL-8-0-27(64x-bit)

    - **优化的性能**:MySQL 8.0系列引入了多项性能提升措施,包括更快的查询处理、优化的数据类型和索引策略,以及内存管理的改进。 - **窗口函数**:新添加的窗口函数允许在结果集的行之间执行计算,无需使用子查询...

    mysql-5.6.38-liunx-64bit

    总的来说,"mysql-5.6.38-linux-64bit"是一个用于Linux平台的MySQL数据库软件包,提供了丰富的功能和优化,对于需要高性能、高可用性的数据库应用来说,是一个理想的选择。通过正确安装和配置,可以构建稳定且高效的...

    mysql-shell-8.0.20-windows-x86-64bit.7z

    3. JSON支持:MySQL 8.0引入了对JSON数据类型的广泛支持,MySQL Shell能够方便地处理JSON文档,包括查询、更新和操作JSON字段。 4. 数据库脚本执行:用户可以编写脚本文件,并在Shell中执行,这有助于自动化重复性...

    MySQL8.4.0 LTS(mysql-8.4.0-solaris11-sparc-64bit.tar.gz)

    5. **JSON支持**:MySQL 8.4.0 可能扩展了对JSON数据类型的支持,包括JSON字段的索引和查询优化,使得数据库可以更好地处理半结构化数据。 6. **窗口函数和分析函数**:SQL查询语句中添加了窗口函数和分析函数,...

    云平台开发技术人员MySQL数据库知识参考手册实用.doc

    - **数值类型**:详细解释了MySQL中的各种数值类型,如BIT、TINYINT、BOOL等,包括它们的范围、精度和使用场景。 2. **进阶篇**(第3~9章) - **第三章 字符集和存储引擎** - 讨论字符集选择的重要性,以及不同...

    PostgreSQL 中文手册(书签全)

    根据提供的文件信息,我们可以归纳和展开一系列与PostgreSQL相关的知识点,尤其聚焦于表格定义、模式Schema、表的继承和分区、数据类型、函数与操作符、索引、事务隔离、性能提升技巧、服务器配置、角色与权限、...

    如何整理SQL Server输入数据

    对于难以理解或用途不明的varchar列,为了确定其最大长度,作者通过查询`INFORMATION_SCHEMA.COLUMNS`系统视图获取列名、数据类型、最大长度和是否允许为空的信息。然后,使用`Max(Len( ColumnName ))`来找出每列的...

    云平台开发技术人员MySQL数据库知识参考手册.doc

    第2章则详细阐述了MySQL中的各种数据类型,如数值类型(BIT、TINYINT、BOOL等)、字符串类型(CHAR、VARCHAR等)、日期和时间类型(DATE、TIME、DATETIME等),这些数据类型的选择直接影响到数据库的设计和性能。...

    MySQL win7 64bit

    4. **性能优化**:5.5版本对查询优化器进行了重大改进,包括更好的索引使用策略和更准确的成本估算,从而提高了查询执行效率。 5. **分区功能**:对于大型表,MySQL 5.5提供了更灵活的分区策略,如线性哈希、范围和...

    云平台开发人员MySQL数据库知识手册

    基础篇的目的是帮助读者快速了解 MySQL 使用及相关的命令,以及 MySQL 数据库中的基础数据类型,为后续 schema 设计、性能调优奠定基础。本篇章节涵盖了 HELP 命令、服务端帮助命令、快速查阅帮助、数据基本类型等...

    postgresql中文手册9.1

    #### 数据类型 - **数值类型**:包括整数(如 `integer`)、浮点数(如 `real` 和 `double precision`)以及精确数字(如 `numeric` 和 `decimal`)。 - **数组**:支持数组类型,例如: ```sql CREATE TABLE ...

    实用的SQL语言

    - **创建基本表**:使用 `CREATE TABLE` 语句创建基本表,并指定列名和数据类型以及约束条件: ```sql CREATE TABLE schema_name.table_name ( column_name data_type, ... [PRIMARY KEY], [CHECK], [FOREIGN ...

    sql笔记共享

    从给定的文件信息中,我们可以提炼出一系列关于SQL及其在SQL Server中的应用的重要知识点,这些知识点涵盖了数据类型、数据库管理语言(DML)、数据定义语言(DDL)、数据控制语言(DCL)以及一些基本的SQL操作命令...

    珍藏版mysql-installer-community-5.7.23.0.msi

    3. **JSON支持**:MySQL 5.7增加了对JSON数据类型的支持,允许存储非结构化数据,同时提供了处理JSON文档的函数和操作。 4. **增强的全文搜索**:MySQL 5.7的全文搜索功能得到加强,包括对部分单词搜索的支持,以及...

    [应用开发及迁移]KingbaseES_V8R3至V8R6迁移最佳实践.pdf

    - **3.4.2 Data Type Compatibility**:对数据类型进行了扩展,支持更多的数据类型,包括JSON类型,增强了数据处理能力。 - **3.4.3 Indexing Improvements**:优化了索引机制,提高了查询效率,并减少了维护成本。 ...

    mysql-5.7.16.7z

    3. **JSON支持**:MySQL 5.7开始支持JSON数据类型,允许存储和查询JSON格式的数据,为非结构化数据处理提供了便利。这使得MySQL在大数据和NoSQL领域中更具竞争力。 4. **全文搜索增强**:引入了FTS(Full-Text ...

    2021-2022计算机二级等级考试试题及答案No.3317.docx

    3. **内模式(Internal Schema)或存储模式(Storage Schema)**:描述数据在物理存储介质上的存储方式和存储位置,如数据文件的组织形式、存储分配细节、索引等。 ### 字符串判断与表达式 对于变量`e`为`char`...

    HANA studio安装及操作手册

    HANA引入了列式存储技术,因此表格可以分为ROW TABLE(行表)和COLUMN TABLE(列表)两种类型。 - **作用**:用于存储数据,并支持关系型数据间的关联连接。 ##### 3. VIEWS (视图) - **定义**:HANA VIEW类似于...

    2021-2022计算机二级等级考试试题及答案No.11450.docx

    - **强制类型转换**:当从一种数据类型转换为另一种数据类型时,如果目标类型比源类型更小,则需要进行强制类型转换。例如,从`int`类型转换为`char`类型。 ### 22. 触发事件的顺序 - **Load事件**:在窗体加载时...

    实用SQL语言(学习笔记)

    SQL支持多种数据类型,如数值型(integer, smallint, real, double precision, float, numeric)、字符串型(char, varchar)、位串型(bit, bit varying)以及时间型(date, time)。不同的数据库管理系统可能对...

Global site tag (gtag.js) - Google Analytics