`
lxneng
  • 浏览: 190144 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

CHAR定长字段对MyISAM和InnoDB的意义

阅读更多

作者:老王

先看看在MyISAM中的情况:

对于MyISAM而言,如果没有VARCHAR,TEXT等变长类型,那么每行数据所占用的空间都是定长的(Fixed),俗称静态表,相对应的就是动态表。

当执行一次查询时,MySQL可以通过索引文件找到所需内容的实际行号,此时,由于每行数据所占用的空间都是定长的(Fixed),所以可以通过查询到的 实际行号直接定位到数据文件的具体位置,比如说查询到的实际行号是10,而一行实际占用的空间是1000byte,那么立刻就能知道所需数据的地址是位于 10*1000=10000byte的位置,形象一点来说,就是直接可以大踏步的跨越数据文件,而不用从头一点点的扫描数据文件。相对应的,如果行长度是 变化的,那么就不能这样计算。所以说静态表提高的效率(提示:使用MyISAM时,MySQL把数据和索引分别保存在独立的文件里)。

所以说CHAR定长字段对MyISAM意义很大,必须重视。

再看看在InnoDB中的情况:

对于InnoDB而言,数据行是没有所谓定长与否的概念的,这是由其结构所决定的:在InnoDB中,数据就位于Primary Key的B-Tree叶节点之上,而除Primary Key之外的索引被称为Secondary Index,它们直接指向Primary Key。

当执行一次查询时,通过Primary Key查询的情况自不用谈,即便是通过Secondary Index查询,由于它们直接指向Primary Key,所以也会直接定位到Primary Key,至于数据,就位于Primary Key的叶节点之上,也就是说,只要定位到了Primary Key,就等同于已经找到了数据,如此一来,就不需要MyISAM中定长的意义了。

所以说CHAR定长字段对InnoDB意义很小,可以忽视。

=============================

引申一点来看待这个问题:如果使用类似主服务器是InnoDB,从服务器是MyISAM这样的主从结构,那么就有必要针对不同的表类型考虑CHAR的取舍,头脑中应该一直有这样的概念,不要想当然的认为主从服务器中表的字段类型必须一致。

下面在记录几个可能对读者有帮助的文章:

MyISAM 索引结构了解 - MyISAM Index Structure
Innodb 索引结构了解 - Innodb Index Structure

分享到:
评论

相关推荐

    mysql面试整理1

    - char是定长字符串,存储速度快但浪费空间,适合对性能要求高的场景。 - varchar是变长字符串,存储空间利用率高,但存取速度相对较慢。 5. **varchar(50)中的50含义?** 表示最多可以存储50个字符,但在排序时...

    JAVA-数据库面试题.docx

    - CHAR是定长类型,无论实际数据多长,都会占用指定长度的存储空间,不足部分用空格填充。 4. 数据库事务的四大特性(ACID): - 原子性(Atomicity):事务是不可分割的操作单元,要么全部完成,要么全部撤销。 ...

    mysql性能优化总结

    - **定长与变长字段的分离**:将定长字段(如整型、日期时间类型)与变长字段(如VARCHAR、TEXT)分开存储,可以提升查询效率,因为定长字段处理更快。 - **常用与不常用字段分离**:将不经常使用的字段独立出来,...

    MySQL数据库面试题 20个经典常用面试题_需要找工作的一定要看 共11页.pdf

    - varchar在查询时可能需要额外的字符比较,而char是定长的,查询效率相对较高。 - varchar(50)中的50表示最多可存储50个字符。 4. **InnoDB事务与日志实现**: InnoDB使用回滚段记录事务的改变,同时利用redo ...

    mysql-存储引擎和数据库对象实验五.docx

    CHAR 是定长的字符串类型,会对尾部空格进行处理,VARCHAR 是变长的字符串类型,比实际字符多 1~2 字节用于记录长度。在 InnoDB 存储引擎中建议使用 VARCHAR 存储字符串。 四、TEXT 和 BLOB TEXT 和 BLOB 是用于...

    MySQL 50 道面试题及答案.docx

    - CHAR是定长字符串,存储时会填充空格,检索时会去掉尾部空格。 - VARCHAR是变长字符串,节省空间,但处理时稍复杂。 6. **主键与候选键**: - 主键是唯一标识表中一行的键,每个表只能有一个主键。 - 候选键...

    最全MySQL面试60题和答案.docx

    - CHAR和VARCHAR的区别在于CHAR是定长的,VARCHAR是变长的,CHAR在存储时会填充空格,检索时会去掉尾部空格。 - 主键和候选键都是能唯一标识一行的键,但一个表只能有一个主键,候选键可以有多个。 5. **自增字段...

    【MySQL面试题干货集合】20个经典常用面试题-需要找工作的一定要看 共11页.pdf

    - char是定长字符串,无论内容多寡,都占用指定长度的空间。 - varchar(50)的50表示最大可存储50个字符,int(20)的20则不是表示长度,而是显示宽度,不影响存储。 4. **InnoDB事务与日志实现**: - InnoDB使用...

    最全MySQL面试60题和答案

    - CHAR是定长字符串,存储时用空格填充到指定长度。 - VARCHAR是变长字符串,只存储实际占用的空间,节省空间。 6. **主键和候选键**: - 主键是唯一的标识符,一个表只能有一个主键。 - 候选键是潜在的主键,...

    超全MySQL面试常见题和答案

    - CHAR是定长字符串,浪费空间但存储速度快。 - VARCHAR是变长字符串,节省空间但处理稍慢。 6. **主键与候选键**: - 主键是表的唯一标识,一张表只能有一个主键。 - 任何能唯一标识一行的键都可以称为候选键...

    MySQL经典面试题.doc

    2. **MyISAM与InnoDB的区别**:MyISAM不支持事务,而InnoDB支持;InnoDB有行级锁定,MyISAM只有表级锁定;InnoDB有ACID特性,MyISAM没有;InnoDB使用聚簇索引,MyISAM使用非聚簇索引;InnoDB支持外键,MyISAM不支持...

    20个「MySQL」经典面试题

    char是定长字符串,浪费空间。 - varchar(50)的50表示最大长度,可以存储最多50个字符,存储时会根据实际长度占用空间。 - int(20)的20表示显示宽度,不影响存储,最大值和最小值不受此影响。 5. **InnoDB的事务...

    mysql经典面试题1

    CHAR是定长类型,空间利用率低,但存储效率高。VARCHAR(50)表示最多存储50个字符。 4. **事务与日志**: - **InnoDB事务**:使用redo log(重做日志)和undo log(回滚日志)确保事务的原子性和持久性。 - **日志...

    MySQL55题答案.pdf

    11. **CHAR与VARCHAR的区别**:CHAR是定长字符串,空间预先分配,不足部分用空格填充,检索时去除尾部空格;VARCHAR是变长字符串,只存储实际字符长度,节省空间,但处理起来稍微复杂些。 12. **字符串类型**:...

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

    4. **存储引擎**:不同的存储引擎(如InnoDB和MyISAM)对`CHAR`和`VARCHAR`的处理方式可能略有不同,这会影响它们的性能表现。例如,MyISAM在`ROW_FORMAT=FIXED`下,所有字段都将按照固定长度处理,这可能会使`...

    30导精选mysql面试题

    11. **MyISAM和InnoDB特点**: - **MyISAM**:不支持事务,但支持表级锁,非聚集索引,不保存行数,适合读多写少场景。 - **InnoDB**:支持事务和行级锁,保证ACID特性,适合并发高和事务需求的场景,存储空间较大...

    MYSQL专题-查询优化-使用索引-安全隐患-事务与锁.docx

    CHAR 是定长的,而 VARCHAR 是变长的。在使用 MyISAM 数据存储引擎的表中,如果能够确定长度,那么使用 CHAR 类型可以提高查询速度。对于 MEMORY 数据表,由于使用固定长度的数据行存储,因此 CHAR 和 VARCHAR 都...

    最全MySQL面试题集合

    Innodb 和 MyISAM 的区别 * MyISAM 是非事务安全的,而 InnoDB 是事务安全的 * MyISAM 锁的粒度是表级的,而 InnoDB 支持行级锁 * MyISAM 支持全文类型索引,而 InnoDB 不支持全文索引 * MyISAM 相对简单,效率上要...

Global site tag (gtag.js) - Google Analytics